diff --git a/docs/scripts/bundle.js b/docs/scripts/bundle.js index 4b0759a..0effe1f 100644 --- a/docs/scripts/bundle.js +++ b/docs/scripts/bundle.js @@ -1 +1 @@ -(()=>{var __webpack_modules__={697:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// NAMESPACE OBJECT: ./src/index.ts\nvar src_namespaceObject = {};\n__webpack_require__.r(src_namespaceObject);\n__webpack_require__.d(src_namespaceObject, {\n Axis: () => (Axis),\n IsometricCanvas: () => (IsometricCanvas),\n IsometricCircle: () => (IsometricCircle),\n IsometricGroup: () => (IsometricGroup),\n IsometricPath: () => (IsometricPath),\n IsometricPentagram: () => (IsometricPentagram),\n IsometricRectangle: () => (IsometricRectangle),\n IsometricStarPolygon: () => (IsometricStarPolygon),\n IsometricText: () => (IsometricText),\n LineCap: () => (LineCap),\n LineJoin: () => (LineJoin),\n PlaneView: () => (PlaneView)\n});\n\n// EXTERNAL MODULE: ./node_modules/.pnpm/google-code-prettify@1.0.5/node_modules/google-code-prettify/bin/run_prettify.min.js\nvar run_prettify_min = __webpack_require__(966);\n;// ./src/@constants/index.ts\nvar SVG_NAMESPACE = \'http://www.w3.org/2000/svg\';\nvar SVG_ELEMENTS;\n(function (SVG_ELEMENTS) {\n SVG_ELEMENTS["svg"] = "svg";\n SVG_ELEMENTS["group"] = "g";\n SVG_ELEMENTS["path"] = "path";\n SVG_ELEMENTS["rect"] = "rect";\n SVG_ELEMENTS["text"] = "text";\n SVG_ELEMENTS["tspan"] = "tspan";\n SVG_ELEMENTS["pattern"] = "pattern";\n SVG_ELEMENTS["image"] = "image";\n SVG_ELEMENTS["animate"] = "animate";\n SVG_ELEMENTS["animateTransform"] = "animateTransform";\n})(SVG_ELEMENTS || (SVG_ELEMENTS = {}));\nvar SVG_PROPERTIES;\n(function (SVG_PROPERTIES) {\n SVG_PROPERTIES["viewBox"] = "viewBox";\n})(SVG_PROPERTIES || (SVG_PROPERTIES = {}));\nvar DECIMALS = 6;\nvar SQRT3 = +(Math.sqrt(3).toFixed(DECIMALS));\nvar HSQRT3 = +((Math.sqrt(3) / 2).toFixed(DECIMALS));\nvar DEFAULT_WIDTH = 640;\nvar DEFAULT_HEIGHT = 480;\nvar N = \'(-?\\\\d+(?:\\\\.\\\\d+)?|-?\\\\.\\\\d+)\';\nvar S = \'\\\\s*\';\nvar SS = \'\\\\s+\';\nvar POINT = "".concat(N).concat(SS).concat(N).concat(SS).concat(N);\nvar CURVE = "".concat(POINT).concat(SS).concat(POINT);\nvar COMMANDS_REGEXP = new RegExp("(?:(M|L)".concat(S).concat(POINT).concat(S, "|(C)").concat(S).concat(CURVE, ")").concat(S), \'g\');\nvar SCALE = Math.sqrt(3 / 2);\nvar ROT_60 = Math.PI / 3;\nvar ROT_45 = Math.PI / 4;\nvar ROT_CMA = Math.atan(Math.SQRT2);\nvar Colors;\n(function (Colors) {\n Colors["white"] = "white";\n Colors["black"] = "black";\n})(Colors || (Colors = {}));\nvar LineCap;\n(function (LineCap) {\n LineCap["butt"] = "butt";\n LineCap["square"] = "square";\n LineCap["round"] = "round";\n})(LineCap || (LineCap = {}));\nvar LineJoin;\n(function (LineJoin) {\n LineJoin["miter"] = "miter";\n LineJoin["round"] = "round";\n LineJoin["bevel"] = "bevel";\n})(LineJoin || (LineJoin = {}));\nvar Command;\n(function (Command) {\n Command["move"] = "move";\n Command["line"] = "line";\n Command["curve"] = "curve";\n})(Command || (Command = {}));\nvar PlaneView;\n(function (PlaneView) {\n PlaneView["FRONT"] = "FRONT";\n PlaneView["SIDE"] = "SIDE";\n PlaneView["TOP"] = "TOP";\n})(PlaneView || (PlaneView = {}));\nvar Axis;\n(function (Axis) {\n Axis["RIGHT"] = "RIGHT";\n Axis["LEFT"] = "LEFT";\n Axis["TOP"] = "TOP";\n})(Axis || (Axis = {}));\nvar Typeof;\n(function (Typeof) {\n Typeof["UNDEFINED"] = "undefined";\n Typeof["NUMBER"] = "number";\n})(Typeof || (Typeof = {}));\nvar EVENTS;\n(function (EVENTS) {\n EVENTS["MOUSE_MOVE"] = "mousemove";\n EVENTS["MOUSE_DOWN"] = "mousedown";\n EVENTS["MOUSE_UP"] = "mouseup";\n EVENTS["TOUCH_START"] = "touchstart";\n EVENTS["TOUCH_MOVE"] = "touchmove";\n EVENTS["TOUCH_END"] = "touchend";\n})(EVENTS || (EVENTS = {}));\nvar ORIGIN;\n(function (ORIGIN) {\n ORIGIN["CENTER"] = "center";\n ORIGIN["LEFT"] = "left";\n ORIGIN["RIGHT"] = "right";\n ORIGIN["TOP"] = "top";\n ORIGIN["BOTTOM"] = "bottom";\n})(ORIGIN || (ORIGIN = {}));\n\n;// ./src/@utils/math.ts\n\nvar round = function (n, d) {\n var exp = Math.pow(10, d);\n return Math.round(n * exp) / exp;\n};\nvar radian = function (a) { return a * Math.PI / 180; };\nvar sincos = function (r) { return ({\n sin: round(Math.sin(r), DECIMALS),\n cos: round(Math.cos(r), DECIMALS)\n}); };\nvar getPointsDiff = function (pointA, pointB) { return ({\n x: pointA.x - pointB.x,\n y: pointA.y - pointB.y\n}); };\nvar getPointsDistance = function (pointA, pointB) {\n var diff = getPointsDiff(pointA, pointB);\n return Math.sqrt(Math.pow(diff.x, 2) + Math.pow(diff.y, 2));\n};\nvar translatePoint = function (point, angle, distance) { return ({\n x: point.x + Math.cos(angle) * distance,\n y: point.y + Math.sin(angle) * distance\n}); };\nvar rotate = function (point, center, angle) {\n var diff = getPointsDiff(point, center);\n var x = diff.x * Math.cos(angle) - diff.y * Math.sin(angle);\n var y = diff.x * Math.sin(angle) + diff.y * Math.cos(angle);\n return {\n x: center.x + x,\n y: center.y + y\n };\n};\nvar getPointsAngle = function (pointA, pointB) {\n var diff = getPointsDiff(pointB, pointA);\n return Math.atan2(diff.y, diff.x);\n};\nvar getOrientation = function (p1, p2, p3) {\n var value = (p2.y - p1.y) * (p3.x - p2.x) - (p2.x - p1.x) * (p3.y - p2.y);\n return value >= 0 ? 0 : 1;\n};\nvar getPointFromIsometricPoint = function (centerX, centerY, point, scale) {\n return {\n x: round(centerX + (point.r - point.l) * scale * HSQRT3, DECIMALS),\n y: round(centerY + ((point.r + point.l) / 2 - point.t) * scale, DECIMALS)\n };\n};\nvar getTopPlanePointFromCoordinates = function (x, y) {\n var XHSQRT3 = x / HSQRT3;\n var right = (y * 2 + XHSQRT3) / 2;\n var left = right - XHSQRT3;\n return {\n right: right,\n left: left\n };\n};\nvar getFrontPlanePointFromCoordinates = function (x, y) {\n var left = -x / HSQRT3;\n var top = left / 2 - y;\n return {\n left: left,\n top: top\n };\n};\nvar getSidePlanePointFromCoordinates = function (x, y) {\n var right = x / HSQRT3;\n var top = right / 2 - y;\n return {\n right: right,\n top: top\n };\n};\nvar getEllipsisSpecs = function (pointA, pointB, control) {\n var diff = getPointsDiff(pointB, pointA);\n var center = { x: pointA.x + diff.x / 2, y: pointA.y + diff.y / 2 };\n var P = rotate(pointB, center, Math.PI / 2);\n var D = { x: P.x + (control.x - P.x) / 2, y: P.y + (control.y - P.y) / 2 };\n var radius = getPointsDistance(D, center);\n var U = translatePoint(D, getPointsAngle(D, P), radius);\n var V = translatePoint(D, getPointsAngle(D, control), radius);\n return [\n round(getPointsDistance(control, U), DECIMALS),\n round(getPointsDistance(control, V), DECIMALS),\n round(getPointsAngle(center, V) * 180 / Math.PI, DECIMALS)\n ];\n};\nvar randomId = function () { return Math.random().toString(16).slice(2); };\nvar uuid = function () { return Array.from(Array(3)).map(function () { return randomId(); }).join(\'-\'); };\n\n;// ./src/@utils/matrix.ts\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\nvar multiplyMatrix = function (m1, m2) { return (m1.map(function (row, i) { return (m2[0].map(function (_, j) {\n return row.reduce(function (acc, _, n) {\n return acc + m1[i][n] * m2[n][j];\n }, 0);\n})); })); };\nvar multiplyMatrices = function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i] = arguments[_i];\n }\n var matrix = m[0];\n for (var i = 1; i < m.length; i++) {\n matrix = multiplyMatrix(matrix, m[i]);\n }\n return matrix;\n};\nvar rotateX = function (r) {\n var sc = sincos(r);\n return [\n [1, 0, 0],\n [0, sc.cos, -sc.sin],\n [0, sc.sin, sc.cos]\n ];\n};\nvar rotateY = function (r) {\n var sc = sincos(r);\n return [\n [sc.cos, 0, sc.sin],\n [0, 1, 0],\n [-sc.sin, 0, sc.cos]\n ];\n};\nvar rotateZ = function (r) {\n var sc = sincos(r);\n return [\n [sc.cos, -sc.sin, 0],\n [sc.sin, sc.cos, 0],\n [0, 0, 1]\n ];\n};\nvar topMatrix = multiplyMatrices(rotateX(ROT_CMA), rotateZ(-ROT_45));\nvar frontMatrix = multiplyMatrices(rotateZ(-ROT_60), rotateX(ROT_CMA), rotateZ(ROT_45));\nvar sideMatrix = multiplyMatrices(rotateZ(ROT_60), rotateX(ROT_CMA), rotateZ(-ROT_45));\nvar rotationToRotationMatrix = function (view, rotation) {\n var value = radian(rotation.value);\n switch (view) {\n case PlaneView.TOP: {\n switch (rotation.axis) {\n case Axis.TOP:\n return rotateZ(value);\n case Axis.LEFT:\n return rotateX(-value);\n case Axis.RIGHT:\n return rotateY(value);\n default:\n return null;\n }\n }\n case PlaneView.FRONT: {\n switch (rotation.axis) {\n case Axis.TOP:\n return rotateY(value);\n case Axis.LEFT:\n return rotateX(value);\n case Axis.RIGHT:\n return rotateZ(value);\n default:\n return null;\n }\n }\n case PlaneView.SIDE: {\n switch (rotation.axis) {\n case Axis.TOP:\n return rotateY(value);\n case Axis.LEFT:\n return rotateZ(value);\n case Axis.RIGHT:\n return rotateX(-value);\n default:\n return null;\n }\n }\n default:\n return null;\n }\n};\nvar getViewMatrix = function (planeView, rotation) {\n var rotationMatrices = [];\n var rotationMatrix = rotation\n ? rotationToRotationMatrix(planeView, rotation)\n : null;\n if (rotationMatrix)\n rotationMatrices.push(rotationMatrix);\n switch (planeView) {\n case PlaneView.TOP: {\n return multiplyMatrices.apply(void 0, __spreadArray([topMatrix], rotationMatrices, false));\n }\n case PlaneView.FRONT: {\n return multiplyMatrices.apply(void 0, __spreadArray([frontMatrix], rotationMatrices, false));\n }\n case PlaneView.SIDE: {\n return multiplyMatrices.apply(void 0, __spreadArray([sideMatrix], rotationMatrices, false));\n }\n }\n return null;\n};\n\n;// ./src/@utils/svg.ts\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar svg_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\nvar addSVGProperties = function (svg, props) {\n Object.keys(props).forEach(function (prop) {\n svg.setAttributeNS(null, prop, props[prop]);\n });\n};\nvar getCommandsWithStart = function (commands) {\n return commands.length === 0 || commands[0].command === Command.move\n ? svg_spreadArray([], commands, true) : svg_spreadArray([\n {\n command: Command.move,\n point: { r: 0, l: 0, t: 0 }\n }\n ], commands, true);\n};\nvar getSVGPath = function (commands, centerX, centerY, scale, autoclose) {\n var drawCommands = getCommandsWithStart(commands);\n var svgPaths = drawCommands.map(function (c, index) {\n var point = getPointFromIsometricPoint(centerX, centerY, c.point, scale);\n switch (c.command) {\n case Command.move:\n return "M".concat(point.x, " ").concat(point.y);\n case Command.line:\n return "L".concat(point.x, " ").concat(point.y);\n case Command.curve: {\n var start = getPointFromIsometricPoint(centerX, centerY, commands[index - 1].point, scale);\n var control = getPointFromIsometricPoint(centerX, centerY, c.control, scale);\n var ellipsisSpecs = getEllipsisSpecs(start, point, control);\n var sweepFlag = getOrientation(start, control, point);\n return "A ".concat(ellipsisSpecs[0], " ").concat(ellipsisSpecs[1], " ").concat(ellipsisSpecs[2], " 0 ").concat(sweepFlag, " ").concat(point.x, " ").concat(point.y);\n }\n }\n });\n if (svgPaths.length) {\n var pathEnd = autoclose ? \'z\' : \'\';\n return "".concat(svgPaths.join(\' \').trim()).concat(pathEnd);\n }\n return \'\';\n};\nvar parseDrawCommands = function (commands) {\n var commandsArray = [];\n var array;\n while ((array = COMMANDS_REGEXP.exec(commands)) !== null) {\n var command = array[5] || array[1];\n switch (command) {\n case \'M\':\n commandsArray.push({\n command: Command.move,\n point: { r: +array[2], l: +array[3], t: +array[4] }\n });\n break;\n case \'L\':\n commandsArray.push({\n command: Command.line,\n point: { r: +array[2], l: +array[3], t: +array[4] }\n });\n break;\n case \'C\':\n commandsArray.push({\n command: Command.curve,\n control: { r: +array[6], l: +array[7], t: +array[8] },\n point: { r: +array[9], l: +array[10], t: +array[11] }\n });\n }\n }\n return commandsArray;\n};\nvar translateCommandPoints = function (commands, right, left, top) {\n commands.forEach(function (command) {\n command.point.r += right;\n command.point.l += left;\n command.point.t += top;\n if (command.control) {\n command.control.r += right;\n command.control.l += left;\n command.control.t += top;\n }\n });\n};\nvar getTextureCorner = function (commands, centerX, centerY, scale) {\n var corner = {\n x: Number.MAX_SAFE_INTEGER,\n y: Number.MAX_SAFE_INTEGER\n };\n getCommandsWithStart(commands)\n .forEach(function (c) {\n var point = getPointFromIsometricPoint(centerX, centerY, c.point, scale);\n if (point.x < corner.x ||\n (point.x === corner.x &&\n point.y < corner.y)) {\n corner.x = point.x;\n corner.y = point.y;\n }\n });\n return corner;\n};\nvar isSVGProperty = function (property) {\n return [\n \'fillColor\',\n \'fillOpacity\',\n \'strokeColor\',\n \'strokeOpacity\',\n \'strokeWidth\'\n ].includes(property);\n};\nvar getSVGProperty = function (property) {\n return {\n fillColor: \'fill\',\n fillOpacity: \'fill-opacity\',\n strokeColor: \'stroke\',\n strokeOpacity: \'stroke-opacity\',\n strokeWidth: \'stroke-width\'\n }[property];\n};\nfunction addEventListenerToElement(element, listeners, event, callback, useCapture) {\n var listener = {\n fn: callback,\n fnBind: callback.bind(this)\n };\n listeners.push(listener);\n element.addEventListener(event, listener.fnBind, useCapture);\n}\nfunction removeEventListenerFromElement(element, listeners, event, callback, useCapture) {\n var listener;\n listeners.find(function (ln, index) {\n if (ln.fn === callback) {\n listener = listeners.splice(index, 1)[0];\n return true;\n }\n });\n if (listener) {\n element.removeEventListener(event, listener.fnBind, useCapture);\n }\n}\nvar getPatternTransform = function (corner, planeView, scale, rotation) {\n var matrix = getViewMatrix(planeView, rotation);\n var transform = "translate(".concat(corner.x, " ").concat(corner.y, ")");\n if (matrix) {\n var m1 = round(matrix[0][0], DECIMALS);\n var m2 = round(matrix[1][0], DECIMALS);\n var m3 = round(matrix[0][1], DECIMALS);\n var m4 = round(matrix[1][1], DECIMALS);\n transform += " matrix(".concat(m1, ",").concat(m2, ",").concat(m3, ",").concat(m4, ",0,0)");\n transform += " scale(".concat(round(SCALE * (scale || 1), DECIMALS), ")");\n }\n else if (scale) {\n transform += " scale(".concat(round(scale, DECIMALS), ")");\n }\n return transform;\n};\nvar elementHasSVGParent = function (element) {\n if (element.parentNode) {\n if (element.parentNode.constructor.name === \'SVGSVGElement\') {\n return true;\n }\n return elementHasSVGParent(element.parentNode);\n }\n return false;\n};\nvar getAnimationProperties = function (getPath, animation, props) {\n var properties;\n var localGetPath = function (value) {\n var _a;\n if (props) {\n return getPath(__assign(__assign({}, props), (_a = {}, _a[animation.property] = +value, _a)));\n }\n return getPath(value);\n };\n if (animation.values) {\n if (Array.isArray(animation.values)) {\n properties = {\n values: animation.values.map(function (value) {\n return localGetPath(value);\n }).join(\';\')\n };\n }\n else {\n properties = {\n values: localGetPath(animation.values)\n };\n }\n }\n else {\n properties = {\n from: localGetPath(animation.from),\n to: localGetPath(animation.to)\n };\n }\n return properties;\n};\n\n;// ./src/@store/index.ts\nvar Store = (function () {\n function Store(width, height, scale) {\n this.sizes = {\n centerX: width / 2,\n centerY: height / 2,\n height: height,\n width: width,\n scale: scale\n };\n }\n Object.defineProperty(Store.prototype, "width", {\n get: function () {\n return this.sizes.width;\n },\n set: function (value) {\n this.sizes.width = value;\n this.sizes.centerX = value / 2;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "height", {\n get: function () {\n return this.sizes.height;\n },\n set: function (value) {\n this.sizes.height = value;\n this.sizes.centerY = value / 2;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "scale", {\n get: function () {\n return this.sizes.scale;\n },\n set: function (value) {\n this.sizes.scale = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "centerX", {\n get: function () {\n return this.sizes.centerX;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "centerY", {\n get: function () {\n return this.sizes.centerY;\n },\n enumerable: false,\n configurable: true\n });\n return Store;\n}());\n\n\n;// ./src/@classes/abstract/IsometricStore/IsometricStore.ts\nvar IsometricStore = (function () {\n function IsometricStore() {\n }\n Object.defineProperty(IsometricStore.prototype, "data", {\n get: function () {\n return this.dataStore;\n },\n set: function (store) {\n this.dataStore = store;\n },\n enumerable: false,\n configurable: true\n });\n return IsometricStore;\n}());\n\n\n;// ./src/@classes/abstract/IsometricStore/index.ts\n\n\n;// ./src/@classes/abstract/IsometricElementAbstract/IsometricElementAbstract.ts\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar IsometricElementAbstract = (function (_super) {\n __extends(IsometricElementAbstract, _super);\n function IsometricElementAbstract(id, svgElement) {\n var _this = _super.call(this) || this;\n _this._id = id;\n _this.listeners = [];\n _this.element = document.createElementNS(SVG_NAMESPACE, svgElement);\n addSVGProperties(_this.element, {\n \'id\': _this._id\n });\n return _this;\n }\n IsometricElementAbstract.prototype.setId = function (value) {\n this._id = value;\n addSVGProperties(this.element, {\n \'id\': this._id\n });\n };\n IsometricElementAbstract.prototype.getElement = function () {\n return this.element;\n };\n IsometricElementAbstract.prototype.addEventListener = function (event, callback, useCapture) {\n if (useCapture === void 0) { useCapture = false; }\n addEventListenerToElement.call(this, this.element, this.listeners, event, callback, useCapture);\n return this;\n };\n IsometricElementAbstract.prototype.removeEventListener = function (event, callback, useCapture) {\n if (useCapture === void 0) { useCapture = false; }\n removeEventListenerFromElement(this.element, this.listeners, event, callback, useCapture);\n return this;\n };\n return IsometricElementAbstract;\n}(IsometricStore));\n\n\n;// ./src/@classes/abstract/IsometricElementAbstract/index.ts\n\n\n;// ./src/@classes/abstract/IsometricGraphicAbstract/IsometricGraphicAbstract.ts\nvar IsometricGraphicAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricGraphicAbstract_assign = (undefined && undefined.__assign) || function () {\n IsometricGraphicAbstract_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricGraphicAbstract_assign.apply(this, arguments);\n};\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\nvar defaultObjectProps = {\n fillColor: Colors.white,\n fillOpacity: 1,\n strokeColor: Colors.black,\n strokeDashArray: [],\n strokeLinecap: LineCap.butt,\n strokeLinejoin: LineJoin.round,\n strokeOpacity: 1,\n strokeWidth: 1\n};\nvar IsometricGraphicAbstract = (function (_super) {\n IsometricGraphicAbstract_extends(IsometricGraphicAbstract, _super);\n function IsometricGraphicAbstract(props, svgElement) {\n var _this = _super.call(this, props.id || uuid(), svgElement) || this;\n _this.props = IsometricGraphicAbstract_assign(IsometricGraphicAbstract_assign({}, defaultObjectProps), props);\n _this.animations = [];\n if (_this.props.texture) {\n _this.createTexture(_this.props.texture);\n }\n addSVGProperties(_this.element, IsometricGraphicAbstract_assign({ \'fill\': _this.props.texture\n ? "url(#".concat(_this.patternId, ") ").concat(_this.fillColor)\n : _this.fillColor, \'fill-opacity\': "".concat(_this.fillOpacity), \'stroke\': _this.strokeColor, \'stroke-dasharray\': _this.strokeDashArray.join(\' \'), \'stroke-linecap\': _this.strokeLinecap, \'stroke-linejoin\': _this.strokeLinejoin, \'stroke-opacity\': "".concat(_this.strokeOpacity), \'stroke-width\': "".concat(_this.strokeWidth) }, (_this.props.className && {\n class: _this.props.className\n })));\n return _this;\n }\n IsometricGraphicAbstract.prototype.createTexture = function (texture) {\n this.patternId = "".concat(this.id, "__texture");\n this.pattern = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.pattern);\n addSVGProperties(this.pattern, {\n \'id\': this.patternId,\n \'preserveAspectRatio\': \'none\',\n \'patternUnits\': \'userSpaceOnUse\'\n });\n var image = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.image);\n addSVGProperties(image, {\n \'href\': texture.url,\n \'x\': \'0\',\n \'y\': \'0\',\n \'preserveAspectRatio\': \'none\'\n });\n if (texture.pixelated) {\n addSVGProperties(image, {\n \'style\': \'image-rendering: pixelated\'\n });\n }\n this.pattern.appendChild(image);\n };\n IsometricGraphicAbstract.prototype._updateTexture = function () {\n var image = this.pattern.firstChild;\n if (this.props.texture.url &&\n image.getAttribute(\'href\') !== this.props.texture.url) {\n addSVGProperties(image, {\n \'href\': this.props.texture.url\n });\n }\n if (this.props.texture.pixelated) {\n addSVGProperties(image, {\n \'style\': \'image-rendering: pixelated\'\n });\n }\n else {\n image.removeAttribute(\'style\');\n }\n this.update();\n };\n IsometricGraphicAbstract.prototype.addAnimationBasicProperties = function (attributeName, animation) {\n addSVGProperties(animation.element, {\n repeatCount: "".concat(animation.repeat || \'indefinite\'),\n attributeName: attributeName,\n dur: "".concat(animation.duration || 1, "s")\n });\n };\n IsometricGraphicAbstract.prototype.updateAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (isNativeSVGProperty) {\n var property = getSVGProperty(animation.property);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(property, animation);\n var properties = getAnimationProperties(function (value) { return "".concat(value); }, animation);\n addSVGProperties(animation.element, properties);\n }\n });\n this.updateSubClassAnimations();\n };\n IsometricGraphicAbstract.prototype.updatePatternTransform = function (corner, planeView) {\n var _a, _b, _c;\n if (this.props.texture) {\n var height = this.props.texture.height\n ? "".concat(this.props.texture.height * this.data.scale)\n : \'100%\';\n var width = this.props.texture.width\n ? "".concat(this.props.texture.width * this.data.scale)\n : \'100%\';\n var shift = getPointFromIsometricPoint(0, 0, {\n r: ((_a = this.props.texture.shift) === null || _a === void 0 ? void 0 : _a.right) || 0,\n l: ((_b = this.props.texture.shift) === null || _b === void 0 ? void 0 : _b.left) || 0,\n t: ((_c = this.props.texture.shift) === null || _c === void 0 ? void 0 : _c.top) || 0\n }, this.data.scale);\n var transform = getPatternTransform({\n x: round(corner.x + shift.x, DECIMALS),\n y: round(corner.y + shift.y, DECIMALS)\n }, this.props.texture.planeView || planeView, this.props.texture.scale, this.props.texture.rotation);\n addSVGProperties(this.pattern, {\n \'patternTransform\': transform,\n \'height\': height,\n \'width\': width\n });\n addSVGProperties(this.pattern.firstChild, {\n \'height\': height,\n \'width\': width\n });\n }\n };\n Object.defineProperty(IsometricGraphicAbstract.prototype, "id", {\n get: function () {\n return this._id;\n },\n set: function (value) {\n this.setId(value);\n if (this.pattern) {\n this.patternId = "".concat(this.id, "__texture");\n addSVGProperties(this.pattern, {\n \'id\': this.patternId\n });\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "fillColor", {\n get: function () {\n return this.props.fillColor;\n },\n set: function (value) {\n this.props.fillColor = value;\n addSVGProperties(this.element, {\n \'fill\': this.props.texture\n ? "url(#".concat(this.patternId, ") ").concat(this.fillColor)\n : this.fillColor\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "fillOpacity", {\n get: function () {\n return this.props.fillOpacity;\n },\n set: function (value) {\n this.props.fillOpacity = value;\n addSVGProperties(this.element, { \'fill-opacity\': "".concat(this.fillOpacity) });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "texture", {\n get: function () {\n return this.props.texture;\n },\n set: function (value) {\n var hasTexture = !!this.props.texture;\n this.props.texture = value;\n if (hasTexture) {\n this._updateTexture();\n }\n else {\n this.createTexture(this.props.texture);\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeColor", {\n get: function () {\n return this.props.strokeColor;\n },\n set: function (value) {\n this.props.strokeColor = value;\n addSVGProperties(this.element, { \'stroke\': this.strokeColor });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeDashArray", {\n get: function () {\n return this.props.strokeDashArray;\n },\n set: function (value) {\n this.props.strokeDashArray = value;\n addSVGProperties(this.element, { \'stroke-dasharray\': this.strokeDashArray.join(\' \') });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeLinecap", {\n get: function () {\n return this.props.strokeLinecap;\n },\n set: function (value) {\n this.props.strokeLinecap = LineCap[value];\n addSVGProperties(this.element, { \'stroke-linecap\': this.strokeLinecap });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeLinejoin", {\n get: function () {\n return this.props.strokeLinejoin;\n },\n set: function (value) {\n this.props.strokeLinejoin = LineJoin[value];\n addSVGProperties(this.element, { \'stroke-linejoin\': this.strokeLinejoin });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeOpacity", {\n get: function () {\n return this.props.strokeOpacity;\n },\n set: function (value) {\n this.props.strokeOpacity = value;\n addSVGProperties(this.element, { \'stroke-opacity\': "".concat(this.strokeOpacity) });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeWidth", {\n get: function () {\n return this.props.strokeWidth;\n },\n set: function (value) {\n this.props.strokeWidth = value;\n addSVGProperties(this.element, { \'stroke-width\': "".concat(this.strokeWidth) });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "className", {\n get: function () {\n return this.props.className;\n },\n set: function (value) {\n this.props.className = value;\n addSVGProperties(this.element, {\n \'class\': this.props.className\n });\n },\n enumerable: false,\n configurable: true\n });\n IsometricGraphicAbstract.prototype.getPattern = function () {\n return this.pattern;\n };\n IsometricGraphicAbstract.prototype.updateTexture = function (value) {\n var hasTexture = !!this.props.texture;\n if (hasTexture || value.url) {\n var shift = value.shift, rotation = value.rotation, newProps = __rest(value, ["shift", "rotation"]);\n this.props.texture = hasTexture\n ? IsometricGraphicAbstract_assign(IsometricGraphicAbstract_assign({}, this.props.texture), newProps) : IsometricGraphicAbstract_assign({}, newProps);\n if (shift) {\n this.props.texture.shift = IsometricGraphicAbstract_assign(IsometricGraphicAbstract_assign({}, (this.props.texture.shift || {})), shift);\n }\n if (rotation) {\n this.props.texture.rotation = rotation;\n }\n if (hasTexture) {\n this._updateTexture();\n }\n else {\n this.createTexture(this.props.texture);\n this.update();\n }\n }\n return this;\n };\n IsometricGraphicAbstract.prototype.addAnimation = function (animation) {\n this.animations.push(IsometricGraphicAbstract_assign({}, animation));\n this.update();\n return this;\n };\n IsometricGraphicAbstract.prototype.removeAnimationByIndex = function (index) {\n if (index >= 0 && index < this.animations.length) {\n var animation = this.animations.splice(index, 1)[0];\n if (animation.element && animation.element.parentNode) {\n animation.element.parentNode.removeChild(animation.element);\n }\n }\n return this;\n };\n IsometricGraphicAbstract.prototype.removeAnimations = function () {\n var animations = this.animations.splice(0);\n animations.forEach(function (animation) {\n if (animation.element && animation.element.parentNode) {\n animation.element.parentNode.removeChild(animation.element);\n }\n });\n return this;\n };\n return IsometricGraphicAbstract;\n}(IsometricElementAbstract));\n\n\n;// ./src/@classes/abstract/IsometricGraphicAbstract/index.ts\n\n\n;// ./src/@classes/abstract/IsometricContainerAbstract/IsometricContainerAbstract.ts\nvar IsometricContainerAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar IsometricContainerAbstract = (function (_super) {\n IsometricContainerAbstract_extends(IsometricContainerAbstract, _super);\n function IsometricContainerAbstract(id, svgElement) {\n var _this = _super.call(this, id, svgElement) || this;\n _this._children = [];\n return _this;\n }\n IsometricContainerAbstract.prototype.getChildIndex = function (child) {\n return this._children.indexOf(child);\n };\n IsometricContainerAbstract.prototype.throwChildError = function () {\n throw new Error(\'You cannot provide a child that is not a children of the container\');\n };\n IsometricContainerAbstract.prototype.removeSVGChild = function (child) {\n var svgChild = child.getElement();\n if (child instanceof IsometricGraphicAbstract) {\n var svgPatternChild = child.getPattern();\n if (svgPatternChild && svgPatternChild.parentNode) {\n this.element.removeChild(svgPatternChild);\n }\n }\n if (svgChild.parentNode) {\n this.element.removeChild(svgChild);\n }\n };\n IsometricContainerAbstract.prototype.insertPattern = function (pattern) {\n if (pattern) {\n this.element.insertBefore(pattern, this.element.firstChild);\n }\n };\n Object.defineProperty(IsometricContainerAbstract.prototype, "id", {\n get: function () {\n return this._id;\n },\n set: function (value) {\n this.setId(value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricContainerAbstract.prototype, "children", {\n get: function () {\n return this._children;\n },\n enumerable: false,\n configurable: true\n });\n IsometricContainerAbstract.prototype.update = function () {\n var _this = this;\n if (elementHasSVGParent(this.element)) {\n this._children.forEach(function (child) {\n child.data = _this.data;\n child.update();\n });\n }\n return this;\n };\n IsometricContainerAbstract.prototype.clear = function () {\n var _this = this;\n var children = this._children.splice(0);\n children.forEach(function (child) {\n _this.removeSVGChild(child);\n });\n return this;\n };\n IsometricContainerAbstract.prototype.addChild = function (child) {\n child.data = this.data;\n this._children.push(child);\n if (child instanceof IsometricGraphicAbstract) {\n this.insertPattern(child.getPattern());\n }\n this.element.appendChild(child.getElement());\n child.update();\n return this;\n };\n IsometricContainerAbstract.prototype.addChildren = function () {\n var _this = this;\n var children = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n children[_i] = arguments[_i];\n }\n children.forEach(function (child) { return _this.addChild(child); });\n return this;\n };\n IsometricContainerAbstract.prototype.getChildByIndex = function (index) {\n return this._children[index] || null;\n };\n IsometricContainerAbstract.prototype.getChildById = function (id) {\n var child = this._children.find(function (child) { return child.id === id; });\n return child || null;\n };\n IsometricContainerAbstract.prototype.removeChild = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n this._children.splice(childIndex, 1);\n this.removeSVGChild(child);\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.removeChildren = function () {\n var _this = this;\n var children = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n children[_i] = arguments[_i];\n }\n children.forEach(function (child) {\n var childIndex = _this.getChildIndex(child);\n if (childIndex === -1) {\n _this.throwChildError();\n }\n _this.removeChild(child);\n });\n return this;\n };\n IsometricContainerAbstract.prototype.removeChildByIndex = function (index) {\n if (index >= 0 && index < this._children.length) {\n var child = this._children.splice(index, 1)[0];\n this.removeSVGChild(child);\n }\n return this;\n };\n IsometricContainerAbstract.prototype.removeChildById = function (id) {\n var child = this.getChildById(id);\n if (child) {\n return this.removeChild(child);\n }\n };\n IsometricContainerAbstract.prototype.setChildIndex = function (child, index) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n index = Math.min(Math.max(0, index), this._children.length - 1);\n var movedElement = child.getElement();\n var replacedElement = this._children[index].getElement();\n if (this._children[index] !== child) {\n this._children.splice(childIndex, 1);\n this._children.splice(index, 0, child);\n if (childIndex > index) {\n this.element.insertBefore(movedElement, replacedElement);\n }\n else {\n if (replacedElement.nextSibling) {\n this.element.insertBefore(movedElement, replacedElement.nextSibling);\n }\n else {\n this.element.appendChild(movedElement);\n }\n }\n }\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.bringChildToFront = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n this.setChildIndex(child, this._children.length - 1);\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.bringChildForward = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n if (childIndex < this._children.length - 1) {\n this.setChildIndex(child, childIndex + 1);\n }\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.sendChildToBack = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n this.setChildIndex(child, 0);\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.sendChildBackward = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n if (childIndex > 0) {\n this.setChildIndex(child, childIndex - 1);\n }\n return this;\n }\n this.throwChildError();\n };\n return IsometricContainerAbstract;\n}(IsometricElementAbstract));\n\n\n;// ./src/@classes/abstract/IsometricContainerAbstract/index.ts\n\n\n;// ./src/@classes/public/IsometricCanvas/IsometricCanvas.ts\nvar IsometricCanvas_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricCanvas_assign = (undefined && undefined.__assign) || function () {\n IsometricCanvas_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricCanvas_assign.apply(this, arguments);\n};\n\n\n\n\n\nvar defaultProps = {\n container: \'body\',\n backgroundColor: Colors.white,\n scale: 1,\n height: DEFAULT_HEIGHT,\n width: DEFAULT_WIDTH\n};\nvar IsometricCanvas = (function (_super) {\n IsometricCanvas_extends(IsometricCanvas, _super);\n function IsometricCanvas(props) {\n var _a;\n if (props === void 0) { props = {}; }\n var _this = _super.call(this, props.id || uuid(), SVG_ELEMENTS.svg) || this;\n _this.props = IsometricCanvas_assign(IsometricCanvas_assign({}, defaultProps), props);\n _this.isAnimated = true;\n _this.data = new Store(_this.props.width, _this.props.height, _this.props.scale);\n addSVGProperties(_this.element, (_a = {},\n _a[SVG_PROPERTIES.viewBox] = "0 0 ".concat(_this.data.width, " ").concat(_this.data.height),\n _a.width = "".concat(_this.data.width, "px"),\n _a.height = "".concat(_this.data.height, "px"),\n _a));\n _this.background = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.rect);\n addSVGProperties(_this.background, {\n fill: _this.backgroundColor,\n x: \'0\',\n y: \'0\',\n width: "".concat(_this.data.width, "px"),\n height: "".concat(_this.data.height, "px")\n });\n _this.element.appendChild(_this.background);\n var containerElement = typeof _this.props.container === \'string\'\n ? document.querySelector(_this.props.container)\n : _this.props.container;\n containerElement.appendChild(_this.element);\n return _this;\n }\n Object.defineProperty(IsometricCanvas.prototype, "backgroundColor", {\n get: function () {\n return this.props.backgroundColor;\n },\n set: function (value) {\n this.props.backgroundColor = value;\n addSVGProperties(this.background, { fill: this.backgroundColor });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "scale", {\n get: function () {\n return this.data.scale;\n },\n set: function (value) {\n this.data.scale = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "height", {\n get: function () {\n return this.data.height;\n },\n set: function (value) {\n var _a;\n this.data.height = value;\n addSVGProperties(this.element, (_a = {},\n _a[SVG_PROPERTIES.viewBox] = "0 0 ".concat(this.data.width, " ").concat(this.data.height),\n _a.height = "".concat(this.data.height, "px"),\n _a));\n addSVGProperties(this.background, {\n height: "".concat(this.data.height, "px")\n });\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "width", {\n get: function () {\n return this.data.width;\n },\n set: function (value) {\n var _a;\n this.data.width = value;\n addSVGProperties(this.element, (_a = {},\n _a[SVG_PROPERTIES.viewBox] = "0 0 ".concat(this.data.width, " ").concat(this.data.height),\n _a.width = "".concat(this.data.width, "px"),\n _a));\n addSVGProperties(this.background, {\n width: "".concat(this.data.width, "px")\n });\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "animated", {\n get: function () {\n return this.isAnimated;\n },\n enumerable: false,\n configurable: true\n });\n IsometricCanvas.prototype.getSVGCode = function () {\n return this.element.outerHTML;\n };\n IsometricCanvas.prototype.pauseAnimations = function () {\n var svg = this.element;\n if (typeof svg.pauseAnimations === \'function\') {\n svg.pauseAnimations();\n }\n this.isAnimated = false;\n return this;\n };\n IsometricCanvas.prototype.resumeAnimations = function () {\n var svg = this.element;\n if (typeof svg.unpauseAnimations === \'function\') {\n svg.unpauseAnimations();\n }\n this.isAnimated = true;\n return this;\n };\n return IsometricCanvas;\n}(IsometricContainerAbstract));\n\n\n;// ./src/@classes/public/IsometricCanvas/index.ts\n\n\n\n;// ./src/@utils/other.ts\nvar applyMixins = function (BaseClass, constructor) {\n Object.getOwnPropertyNames(constructor.prototype).forEach(function (name) {\n Object.defineProperty(BaseClass.prototype, name, Object.getOwnPropertyDescriptor(constructor.prototype, name));\n });\n};\n\n;// ./src/@classes/abstract/IsometricDraggableAbstract/constants.ts\nvar NO_LIMITS = [\n Number.MIN_SAFE_INTEGER,\n Number.MAX_SAFE_INTEGER\n];\nvar DRAG_EVENT;\n(function (DRAG_EVENT) {\n DRAG_EVENT["DRAG_START"] = "dragstart";\n DRAG_EVENT["DRAG"] = "drag";\n DRAG_EVENT["DRAG_END"] = "dragend";\n})(DRAG_EVENT || (DRAG_EVENT = {}));\n\n;// ./src/@classes/abstract/IsometricDraggableAbstract/IsometricDraggableAbstract.ts\nvar IsometricDraggableAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricDraggableAbstract_assign = (undefined && undefined.__assign) || function () {\n IsometricDraggableAbstract_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricDraggableAbstract_assign.apply(this, arguments);\n};\nvar IsometricDraggableAbstract_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\nvar _isBrowser = typeof window !== Typeof.UNDEFINED;\nvar _requestAnimationFrame = _isBrowser\n ? (window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.msRequestAnimationFrame)\n : null;\nvar _dragStoreDefault = {\n right: 0,\n left: 0,\n top: 0,\n x: 0,\n y: 0\n};\nvar isMouseEvent = function (event) { return \'clientX\' in event; };\nvar getClientCoords = function (event) {\n if (event instanceof Event) {\n if (isMouseEvent(event)) {\n return {\n clientX: event.clientX,\n clientY: event.clientY\n };\n }\n return {\n clientX: event.touches[0].clientX,\n clientY: event.touches[0].clientY\n };\n }\n return event;\n};\nvar IsometricDraggableAbstract = (function (_super) {\n IsometricDraggableAbstract_extends(IsometricDraggableAbstract, _super);\n function IsometricDraggableAbstract() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n IsometricDraggableAbstract.prototype.setup = function () {\n this.startDrag = this.startDrag.bind(this);\n this.stopDrag = this.stopDrag.bind(this);\n this.moveElement = this.moveElement.bind(this);\n this.dropElement = this.dropElement.bind(this);\n this.animate = this.animate.bind(this);\n if (typeof this._bounds === Typeof.UNDEFINED) {\n this._bounds = false;\n }\n if (typeof this._dragStore === Typeof.UNDEFINED) {\n this._dragStore = _dragStoreDefault;\n }\n if (typeof this._coords === Typeof.UNDEFINED) {\n this._coords = {};\n }\n };\n IsometricDraggableAbstract.prototype.betweenBounds = function (value, bounds) {\n var orderedBounds = IsometricDraggableAbstract_spreadArray([], bounds, true).sort();\n return round(Math.min(Math.max(value, orderedBounds[0]), orderedBounds[1]), DECIMALS);\n };\n IsometricDraggableAbstract.prototype.getBoundOrMaximum = function (prop) {\n var _a;\n if (this.bounds) {\n return (_a = this.bounds[prop]) !== null && _a !== void 0 ? _a : IsometricDraggableAbstract_spreadArray([], NO_LIMITS, true);\n }\n return IsometricDraggableAbstract_spreadArray([], NO_LIMITS, true);\n };\n IsometricDraggableAbstract.prototype.getRight = function (value) {\n var bounds = this.getBoundOrMaximum(\'right\');\n return this.betweenBounds(this._dragStore.right + value / this.data.scale, bounds);\n };\n IsometricDraggableAbstract.prototype.getLeft = function (value) {\n var bounds = this.getBoundOrMaximum(\'left\');\n return this.betweenBounds(this._dragStore.left + value / this.data.scale, bounds);\n };\n IsometricDraggableAbstract.prototype.getTop = function (value) {\n var bounds = this.getBoundOrMaximum(\'top\');\n return this.betweenBounds(this._dragStore.top + value / this.data.scale, bounds);\n };\n IsometricDraggableAbstract.prototype.getFixedCoordinates = function (coords) {\n var _this = this;\n return Object.entries(coords).reduce(function (acc, entry) {\n var fixedCoords = IsometricDraggableAbstract_assign({}, acc);\n switch (entry[0]) {\n case \'right\':\n fixedCoords.right = _this.getRight(entry[1]);\n break;\n case \'left\':\n fixedCoords.left = _this.getLeft(entry[1]);\n break;\n default:\n fixedCoords.top = _this.getTop(entry[1]);\n }\n return fixedCoords;\n }, {});\n };\n IsometricDraggableAbstract.prototype.dispatchEvent = function (eventType) {\n var _a, _b, _c;\n var dragEvent = new CustomEvent(eventType, {\n cancelable: eventType === DRAG_EVENT.DRAG,\n detail: {\n right: (_a = this._coords.right) !== null && _a !== void 0 ? _a : this.right,\n left: (_b = this._coords.left) !== null && _b !== void 0 ? _b : this.left,\n top: (_c = this._coords.top) !== null && _c !== void 0 ? _c : this.top\n }\n });\n this.element.dispatchEvent(dragEvent);\n return dragEvent;\n };\n IsometricDraggableAbstract.prototype.animate = function () {\n if (this._update) {\n if (!this._prevented) {\n if (typeof this._coords.right === Typeof.NUMBER) {\n this.right = this._coords.right;\n }\n if (typeof this._coords.left === Typeof.NUMBER) {\n this.left = this._coords.left;\n }\n if (typeof this._coords.top === Typeof.NUMBER) {\n this.top = this._coords.top;\n }\n }\n _requestAnimationFrame(this.animate);\n }\n };\n IsometricDraggableAbstract.prototype.startDrag = function (event) {\n event.preventDefault();\n var _a = getClientCoords(event), clientX = _a.clientX, clientY = _a.clientY;\n this._dragStore.x = clientX;\n this._dragStore.y = clientY;\n this._dragStore.right = this.right;\n this._dragStore.left = this.left;\n this._dragStore.top = this.top;\n this._update = true;\n this.moveElement({ clientX: clientX, clientY: clientY });\n this.element.addEventListener(EVENTS.TOUCH_MOVE, this.moveElement, true);\n this.element.addEventListener(EVENTS.TOUCH_END, this.dropElement, true);\n document.addEventListener(EVENTS.MOUSE_MOVE, this.moveElement, true);\n document.addEventListener(EVENTS.MOUSE_UP, this.dropElement, true);\n _requestAnimationFrame(this.animate);\n };\n IsometricDraggableAbstract.prototype.moveElement = function (event) {\n var _a = getClientCoords(event), clientX = _a.clientX, clientY = _a.clientY;\n var diffX = clientX - this._dragStore.x;\n var diffY = clientY - this._dragStore.y;\n if (this._drag === PlaneView.TOP) {\n this._coords = this.getFixedCoordinates(getTopPlanePointFromCoordinates(diffX, diffY));\n }\n else if (this._drag === PlaneView.FRONT) {\n this._coords = this.getFixedCoordinates(getFrontPlanePointFromCoordinates(diffX, diffY));\n }\n else {\n this._coords = this.getFixedCoordinates(getSidePlanePointFromCoordinates(diffX, diffY));\n }\n var dragEvent;\n if (event instanceof Event) {\n event.preventDefault();\n if (!this._dragging) {\n this.dispatchEvent(DRAG_EVENT.DRAG_START);\n }\n this._dragging = true;\n dragEvent = this.dispatchEvent(DRAG_EVENT.DRAG);\n }\n this._prevented = !!(dragEvent && dragEvent.defaultPrevented);\n };\n IsometricDraggableAbstract.prototype.dropElement = function () {\n this._update = false;\n this._dragging = false;\n this.element.removeEventListener(EVENTS.TOUCH_MOVE, this.moveElement, true);\n this.element.removeEventListener(EVENTS.TOUCH_END, this.dropElement, true);\n document.removeEventListener(EVENTS.MOUSE_MOVE, this.moveElement, true);\n document.removeEventListener(EVENTS.MOUSE_UP, this.dropElement, true);\n this.dispatchEvent(DRAG_EVENT.DRAG_END);\n };\n IsometricDraggableAbstract.prototype.beginDrag = function () {\n this.element.addEventListener(EVENTS.TOUCH_START, this.startDrag, true);\n this.element.addEventListener(EVENTS.MOUSE_DOWN, this.startDrag, true);\n };\n IsometricDraggableAbstract.prototype.stopDrag = function () {\n this.element.removeEventListener(EVENTS.TOUCH_START, this.startDrag, true);\n this.element.removeEventListener(EVENTS.TOUCH_MOVE, this.moveElement, true);\n this.element.removeEventListener(EVENTS.TOUCH_END, this.dropElement, true);\n this.element.removeEventListener(EVENTS.MOUSE_DOWN, this.startDrag, true);\n document.removeEventListener(EVENTS.MOUSE_MOVE, this.moveElement, true);\n document.removeEventListener(EVENTS.MOUSE_UP, this.dropElement, true);\n };\n Object.defineProperty(IsometricDraggableAbstract.prototype, "right", {\n get: function () {\n return this.props.right;\n },\n set: function (value) {\n if (this.props.right !== value) {\n this.props.right = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "left", {\n get: function () {\n return this.props.left;\n },\n set: function (value) {\n if (this.props.left !== value) {\n this.props.left = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "top", {\n get: function () {\n return this.props.top;\n },\n set: function (value) {\n if (this.props.top !== value) {\n this.props.top = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "drag", {\n get: function () {\n return this._drag || false;\n },\n set: function (value) {\n if (typeof this._drag === Typeof.UNDEFINED) {\n this.setup();\n }\n this._drag = value;\n if (_isBrowser) {\n this.stopDrag();\n this.beginDrag();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "bounds", {\n get: function () {\n return this._bounds || false;\n },\n set: function (value) {\n this._bounds = value;\n var boundsRight = this.getBoundOrMaximum(\'right\');\n var boundsLeft = this.getBoundOrMaximum(\'left\');\n var boundsTop = this.getBoundOrMaximum(\'top\');\n this.right = this.betweenBounds(this.right, boundsRight);\n this.left = this.betweenBounds(this.left, boundsLeft);\n this.top = this.betweenBounds(this.top, boundsTop);\n },\n enumerable: false,\n configurable: true\n });\n return IsometricDraggableAbstract;\n}(IsometricElementAbstract));\n\n\n;// ./src/@classes/abstract/IsometricDraggableAbstract/index.ts\n\n\n;// ./src/@classes/public/IsometricGroup/IsometricGroup.ts\nvar IsometricGroup_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricGroup_assign = (undefined && undefined.__assign) || function () {\n IsometricGroup_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricGroup_assign.apply(this, arguments);\n};\n\n\n\n\n\n\nvar IsometricGroup_defaultProps = {\n right: 0,\n left: 0,\n top: 0,\n};\nvar IsometricGroup = (function (_super) {\n IsometricGroup_extends(IsometricGroup, _super);\n function IsometricGroup(props) {\n if (props === void 0) { props = {}; }\n var _this = _super.call(this, props.id || uuid(), SVG_ELEMENTS.group) || this;\n _this.props = IsometricGroup_assign(IsometricGroup_assign({}, IsometricGroup_defaultProps), props);\n return _this;\n }\n IsometricGroup.prototype.update = function () {\n if (elementHasSVGParent(this.element)) {\n var point = getPointFromIsometricPoint(0, 0, {\n r: this.props.right,\n l: this.props.left,\n t: this.props.top\n }, this.data.scale);\n addSVGProperties(this.element, {\n transform: "translate(".concat(point.x, ", ").concat(point.y, ")")\n });\n }\n return _super.prototype.update.call(this);\n };\n return IsometricGroup;\n}(IsometricContainerAbstract));\n\napplyMixins(IsometricGroup, IsometricDraggableAbstract);\n\n;// ./src/@classes/public/IsometricGroup/index.ts\n\n\n;// ./src/@classes/abstract/IsometricPathAbstract/IsometricPathAbstract.ts\nvar IsometricPathAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar IsometricPathAbstract = (function (_super) {\n IsometricPathAbstract_extends(IsometricPathAbstract, _super);\n function IsometricPathAbstract(props, svgElement) {\n return _super.call(this, props, svgElement) || this;\n }\n IsometricPathAbstract.prototype.updateGraphic = function (planeView, autoclose) {\n if (autoclose === void 0) { autoclose = true; }\n if (elementHasSVGParent(this.element)) {\n var commands = this.getCommands();\n var corner = getTextureCorner(commands, this.data.centerX, this.data.centerY, this.data.scale);\n addSVGProperties(this.element, {\n d: getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, autoclose)\n });\n this.updatePatternTransform(corner, planeView);\n this.updateAnimations();\n }\n };\n return IsometricPathAbstract;\n}(IsometricGraphicAbstract));\n\n\n;// ./src/@classes/abstract/IsometricPathAbstract/index.ts\n\n\n;// ./src/@classes/abstract/IsometricShapeAbstract/IsometricShapeAbstract.ts\nvar IsometricShapeAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricShapeAbstract_assign = (undefined && undefined.__assign) || function () {\n IsometricShapeAbstract_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricShapeAbstract_assign.apply(this, arguments);\n};\n\n\n\n\n\nvar IsometricShapeAbstract_defaultProps = {\n right: 0,\n left: 0,\n top: 0,\n};\nvar IsometricShapeAbstract = (function (_super) {\n IsometricShapeAbstract_extends(IsometricShapeAbstract, _super);\n function IsometricShapeAbstract(props) {\n return _super.call(this, IsometricShapeAbstract_assign(IsometricShapeAbstract_assign({}, IsometricShapeAbstract_defaultProps), props), SVG_ELEMENTS.path) || this;\n }\n IsometricShapeAbstract.prototype.update = function () {\n this.updateGraphic(this.planeView);\n return this;\n };\n IsometricShapeAbstract.prototype.clear = function () {\n addSVGProperties(this.element, {\n d: \'\'\n });\n return this;\n };\n Object.defineProperty(IsometricShapeAbstract.prototype, "planeView", {\n get: function () {\n return this.props.planeView;\n },\n set: function (value) {\n this.props.planeView = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n return IsometricShapeAbstract;\n}(IsometricPathAbstract));\n\napplyMixins(IsometricShapeAbstract, IsometricDraggableAbstract);\n\n;// ./src/@classes/abstract/IsometricShapeAbstract/index.ts\n\n\n;// ./src/@classes/public/IsometricRectangle/IsometricRectangle.ts\nvar IsometricRectangle_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricRectangle_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\nvar IsometricRectangle = (function (_super) {\n IsometricRectangle_extends(IsometricRectangle, _super);\n function IsometricRectangle(props) {\n var _this = this;\n var height = props.height, width = props.width, rest = IsometricRectangle_rest(props, ["height", "width"]);\n _this = _super.call(this, rest) || this;\n _this._width = width;\n _this._height = height;\n return _this;\n }\n IsometricRectangle.prototype.getCommands = function (args) {\n var _a, _b, _c, _d, _e;\n var right = (_a = args === null || args === void 0 ? void 0 : args.right) !== null && _a !== void 0 ? _a : this.right;\n var left = (_b = args === null || args === void 0 ? void 0 : args.left) !== null && _b !== void 0 ? _b : this.left;\n var top = (_c = args === null || args === void 0 ? void 0 : args.top) !== null && _c !== void 0 ? _c : this.top;\n var width = (_d = args === null || args === void 0 ? void 0 : args.width) !== null && _d !== void 0 ? _d : this.width;\n var height = (_e = args === null || args === void 0 ? void 0 : args.height) !== null && _e !== void 0 ? _e : this.height;\n var commands = [{ command: Command.move, point: { r: 0, l: 0, t: 0 } }];\n switch (this.planeView) {\n case PlaneView.FRONT:\n commands.push({ command: Command.line, point: { r: 0, l: width, t: 0 } }, { command: Command.line, point: { r: 0, l: width, t: height } }, { command: Command.line, point: { r: 0, l: 0, t: height } });\n break;\n case PlaneView.SIDE:\n commands.push({ command: Command.line, point: { r: width, l: 0, t: 0 } }, { command: Command.line, point: { r: width, l: 0, t: height } }, { command: Command.line, point: { r: 0, l: 0, t: height } });\n break;\n case PlaneView.TOP:\n commands.push({ command: Command.line, point: { r: width, l: 0, t: 0 } }, { command: Command.line, point: { r: width, l: height, t: 0 } }, { command: Command.line, point: { r: 0, l: height, t: 0 } });\n break;\n }\n translateCommandPoints(commands, right, left, top);\n return commands;\n };\n IsometricRectangle.prototype.getRectanglePath = function (args) {\n var commands = this.getCommands(args);\n return getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, true);\n };\n IsometricRectangle.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n var props = {\n right: _this.right,\n left: _this.left,\n top: _this.top,\n width: _this.width,\n height: _this.height\n };\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var properties = getAnimationProperties(_this.getRectanglePath.bind(_this), animation, props);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n }\n });\n };\n Object.defineProperty(IsometricRectangle.prototype, "width", {\n get: function () {\n return this._width;\n },\n set: function (value) {\n this._width = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricRectangle.prototype, "height", {\n get: function () {\n return this._height;\n },\n set: function (value) {\n this._height = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricRectangle.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricRectangle;\n}(IsometricShapeAbstract));\n\n\n;// ./src/@classes/public/IsometricRectangle/index.ts\n\n\n;// ./src/@classes/public/IsometricCircle/IsometricCircle.ts\nvar IsometricCircle_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricCircle_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\nvar IsometricCircle = (function (_super) {\n IsometricCircle_extends(IsometricCircle, _super);\n function IsometricCircle(props) {\n var _this = this;\n var radius = props.radius, rest = IsometricCircle_rest(props, ["radius"]);\n _this = _super.call(this, rest) || this;\n _this._radius = radius;\n return _this;\n }\n IsometricCircle.prototype.getCommands = function (args) {\n var _a, _b, _c, _d;\n var right = (_a = args === null || args === void 0 ? void 0 : args.right) !== null && _a !== void 0 ? _a : this.right;\n var left = (_b = args === null || args === void 0 ? void 0 : args.left) !== null && _b !== void 0 ? _b : this.left;\n var top = (_c = args === null || args === void 0 ? void 0 : args.top) !== null && _c !== void 0 ? _c : this.top;\n var radius = (_d = args === null || args === void 0 ? void 0 : args.radius) !== null && _d !== void 0 ? _d : this.radius;\n var commands = [];\n switch (this.planeView) {\n case PlaneView.FRONT:\n commands.push({\n command: Command.move,\n point: { r: 0, l: radius, t: 0 }\n }, {\n command: Command.curve,\n point: { r: 0, l: -radius, t: 0 },\n control: { r: 0, l: 0, t: -radius }\n }, {\n command: Command.curve,\n point: { r: 0, l: radius, t: 0 },\n control: { r: 0, l: 0, t: radius }\n });\n break;\n case PlaneView.SIDE:\n commands.push({\n command: Command.move,\n point: { r: -radius, l: 0, t: 0 }\n }, {\n command: Command.curve,\n point: { r: radius, l: 0, t: 0 },\n control: { r: 0, l: 0, t: -radius }\n }, {\n command: Command.curve,\n point: { r: -radius, l: 0, t: 0 },\n control: { r: 0, l: 0, t: radius }\n });\n break;\n case PlaneView.TOP:\n commands.push({\n command: Command.move,\n point: { r: 0, l: radius, t: 0 }\n }, {\n command: Command.curve,\n point: { r: 0, l: -radius, t: 0 },\n control: { r: radius, l: 0, t: 0 }\n }, {\n command: Command.curve,\n point: { r: 0, l: radius, t: 0 },\n control: { r: -radius, l: 0, t: 0 }\n });\n break;\n }\n translateCommandPoints(commands, right, left, top);\n return commands;\n };\n IsometricCircle.prototype.getCirclePath = function (args) {\n var commands = this.getCommands(args);\n return getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, true);\n };\n IsometricCircle.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n var props = {\n right: _this.right,\n left: _this.left,\n top: _this.top,\n radius: _this.radius\n };\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var properties = getAnimationProperties(_this.getCirclePath.bind(_this), animation, props);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n }\n });\n };\n Object.defineProperty(IsometricCircle.prototype, "radius", {\n get: function () {\n return this._radius;\n },\n set: function (value) {\n this._radius = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricCircle.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricCircle;\n}(IsometricShapeAbstract));\n\n\n;// ./src/@classes/public/IsometricCircle/index.ts\n\n\n;// ./src/@classes/abstract/IsometricStarPolygonAbstract/IsometricStarPolygonAbstract.ts\nvar IsometricStarPolygonAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricStarPolygonAbstract_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar IsometricStarPolygonAbstract_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\nvar IsometricStarPolygonAbstract = (function (_super) {\n IsometricStarPolygonAbstract_extends(IsometricStarPolygonAbstract, _super);\n function IsometricStarPolygonAbstract(props) {\n var _this = this;\n var radius = props.radius, points = props.points, density = props.density, _a = props.rotation, rotation = _a === void 0 ? 0 : _a, rest = IsometricStarPolygonAbstract_rest(props, ["radius", "points", "density", "rotation"]);\n _this = _super.call(this, rest) || this;\n _this._radius = radius;\n _this._points = points;\n _this._density = density;\n _this._rotation = rotation;\n _this._sector = 2 * Math.PI / _this._points;\n _this._halfSector = _this._sector / 2;\n return _this;\n }\n IsometricStarPolygonAbstract.prototype.getCommands = function (args) {\n var _a, _b, _c, _d, _e, _f, _g;\n var right = (_a = args === null || args === void 0 ? void 0 : args.right) !== null && _a !== void 0 ? _a : this.right;\n var left = (_b = args === null || args === void 0 ? void 0 : args.left) !== null && _b !== void 0 ? _b : this.left;\n var top = (_c = args === null || args === void 0 ? void 0 : args.top) !== null && _c !== void 0 ? _c : this.top;\n var radius = (_d = args === null || args === void 0 ? void 0 : args.radius) !== null && _d !== void 0 ? _d : this.radius;\n var points = (_e = args === null || args === void 0 ? void 0 : args.points) !== null && _e !== void 0 ? _e : this._points;\n var density = (_f = args === null || args === void 0 ? void 0 : args.density) !== null && _f !== void 0 ? _f : this._density;\n var rotation = (_g = args === null || args === void 0 ? void 0 : args.rotation) !== null && _g !== void 0 ? _g : this.rotation;\n var coordinates = this.get2DCoordinates(radius, points, density, rotation);\n var commands = [];\n switch (this.planeView) {\n case PlaneView.FRONT:\n coordinates.forEach(function (point, index) {\n commands.push({\n command: index === 0\n ? Command.move\n : Command.line,\n point: {\n r: 0,\n l: point.x,\n t: point.y\n }\n });\n });\n break;\n case PlaneView.SIDE:\n coordinates.forEach(function (point, index) {\n commands.push({\n command: index === 0\n ? Command.move\n : Command.line,\n point: {\n r: point.x,\n l: 0,\n t: point.y\n }\n });\n });\n break;\n case PlaneView.TOP:\n coordinates.forEach(function (point, index) {\n commands.push({\n command: index === 0\n ? Command.move\n : Command.line,\n point: {\n r: -point.x,\n l: -point.y,\n t: 0\n }\n });\n });\n break;\n }\n translateCommandPoints(commands, right, left, top);\n return commands;\n };\n IsometricStarPolygonAbstract.prototype._getRadianAngle = function (angle) {\n return angle * Math.PI / 180;\n };\n IsometricStarPolygonAbstract.prototype._getInnerRadius = function (radius, points, density) {\n return radius * Math.cos(Math.PI * density / points) / Math.cos(Math.PI * (density - 1) / points);\n };\n IsometricStarPolygonAbstract.prototype.get2DCoordinates = function (radius, points, density, rotation) {\n var _this = this;\n var innerRadius = this._getInnerRadius(radius, points, density);\n return IsometricStarPolygonAbstract_spreadArray([], Array(this._points), true).reduce(function (points, _undefined, index) {\n var angle = index * _this._sector + 2 * Math.PI - _this._getRadianAngle(rotation);\n var innerAngle = angle + _this._halfSector;\n var oX = Math.sin(angle) * radius;\n var oY = Math.cos(angle) * radius;\n var iX = Math.sin(innerAngle) * innerRadius;\n var iY = Math.cos(innerAngle) * innerRadius;\n return IsometricStarPolygonAbstract_spreadArray(IsometricStarPolygonAbstract_spreadArray([], points, true), [\n { x: oX, y: oY },\n { x: iX, y: iY }\n ], false);\n }, []);\n };\n IsometricStarPolygonAbstract.prototype.getPentagramPath = function (args) {\n var commands = this.getCommands(args);\n return getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, true);\n };\n IsometricStarPolygonAbstract.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n var props = {\n right: _this.right,\n left: _this.left,\n top: _this.top,\n radius: _this.radius,\n points: _this._points,\n density: _this._density,\n rotation: _this.rotation\n };\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var properties = getAnimationProperties(_this.getPentagramPath.bind(_this), animation, props);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n }\n });\n };\n Object.defineProperty(IsometricStarPolygonAbstract.prototype, "radius", {\n get: function () {\n return this._radius;\n },\n set: function (value) {\n this._radius = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricStarPolygonAbstract.prototype, "rotation", {\n get: function () {\n return this._rotation;\n },\n set: function (value) {\n this._rotation = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricStarPolygonAbstract.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricStarPolygonAbstract;\n}(IsometricShapeAbstract));\n\n\n;// ./src/@classes/abstract/IsometricStarPolygonAbstract/index.ts\n\n\n\n;// ./src/@classes/public/IsometricPentagram/IsometricPentagram.ts\nvar IsometricPentagram_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricPentagram_assign = (undefined && undefined.__assign) || function () {\n IsometricPentagram_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricPentagram_assign.apply(this, arguments);\n};\n\nvar IsometricPentagram = (function (_super) {\n IsometricPentagram_extends(IsometricPentagram, _super);\n function IsometricPentagram(props) {\n return _super.call(this, IsometricPentagram_assign(IsometricPentagram_assign({}, props), { points: 5, density: 2 })) || this;\n }\n return IsometricPentagram;\n}(IsometricStarPolygonAbstract));\n\n\n;// ./src/@classes/public/IsometricPentagram/index.ts\n\n\n;// ./src/@classes/public/IsometricStarPolygon/IsometricStarPolygon.ts\nvar IsometricStarPolygon_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\nvar IsometricStarPolygon = (function (_super) {\n IsometricStarPolygon_extends(IsometricStarPolygon, _super);\n function IsometricStarPolygon(props) {\n return _super.call(this, props) || this;\n }\n Object.defineProperty(IsometricStarPolygon.prototype, "points", {\n get: function () {\n return this._points;\n },\n set: function (value) {\n this._points = value;\n this._sector = 2 * Math.PI / this._points;\n this._halfSector = this._sector / 2;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricStarPolygon.prototype, "density", {\n get: function () {\n return this._density;\n },\n set: function (value) {\n this._density = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n return IsometricStarPolygon;\n}(IsometricStarPolygonAbstract));\n\n\n;// ./src/@classes/public/IsometricStarPolygon/index.ts\n\n\n;// ./src/@classes/public/IsometricPath/IsometricPath.ts\nvar IsometricPath_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar IsometricPath = (function (_super) {\n IsometricPath_extends(IsometricPath, _super);\n function IsometricPath(props) {\n if (props === void 0) { props = {}; }\n var _this = _super.call(this, props, SVG_ELEMENTS.path) || this;\n _this.getPathFromCommands = function (commands) { return getSVGPath(parseDrawCommands("".concat(commands)), _this.data.centerX, _this.data.centerY, _this.data.scale, _this._autoclose); };\n _this.commands = [];\n _this._autoclose = \'autoclose\' in props\n ? props.autoclose\n : true;\n return _this;\n }\n IsometricPath.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n if (animation.property === \'path\') {\n var properties = getAnimationProperties(_this.getPathFromCommands.bind(_this), animation);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n });\n };\n IsometricPath.prototype.getCommands = function () {\n return this.commands;\n };\n Object.defineProperty(IsometricPath.prototype, "autoclose", {\n get: function () {\n return this._autoclose;\n },\n set: function (value) {\n this._autoclose = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricPath.prototype.update = function () {\n this.updateGraphic(undefined, this.autoclose);\n return this;\n };\n IsometricPath.prototype.clear = function () {\n this.commands.splice(0);\n addSVGProperties(this.element, {\n d: \'\'\n });\n return this;\n };\n IsometricPath.prototype.moveTo = function (right, left, top) {\n this.commands.push({\n command: Command.move,\n point: { r: right, l: left, t: top }\n });\n this.update();\n return this;\n };\n IsometricPath.prototype.lineTo = function (right, left, top) {\n this.commands.push({\n command: Command.line,\n point: { r: right, l: left, t: top }\n });\n this.update();\n return this;\n };\n IsometricPath.prototype.curveTo = function (controlRight, controlLeft, controlTop, right, left, top) {\n this.commands.push({\n command: Command.curve,\n control: { r: controlRight, l: controlLeft, t: controlTop },\n point: { r: right, l: left, t: top }\n });\n this.update();\n return this;\n };\n IsometricPath.prototype.mt = function (right, left, top) {\n return this.moveTo(right, left, top);\n };\n IsometricPath.prototype.lt = function (right, left, top) {\n return this.lineTo(right, left, top);\n };\n IsometricPath.prototype.ct = function (controlRight, controlLeft, controlTop, right, left, top) {\n return this.curveTo(controlRight, controlLeft, controlTop, right, left, top);\n };\n IsometricPath.prototype.draw = function (commands) {\n this.commands = parseDrawCommands(commands);\n this.update();\n return this;\n };\n IsometricPath.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricPath;\n}(IsometricPathAbstract));\n\n\n;// ./src/@classes/public/IsometricPath/index.ts\n\n\n;// ./src/@classes/public/IsometricText/IsometricText.ts\nvar IsometricText_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricText_assign = (undefined && undefined.__assign) || function () {\n IsometricText_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricText_assign.apply(this, arguments);\n};\nvar IsometricText_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\nvar IsometricText = (function (_super) {\n IsometricText_extends(IsometricText, _super);\n function IsometricText(props) {\n var _a;\n var _this = this;\n var planeView = props.planeView, _b = props.text, text = _b === void 0 ? \'\' : _b, _c = props.fontFamily, fontFamily = _c === void 0 ? \'Arial\' : _c, _d = props.fontSize, fontSize = _d === void 0 ? 12 : _d, _e = props.fontStyle, fontStyle = _e === void 0 ? \'normal\' : _e, _f = props.fontWeight, fontWeight = _f === void 0 ? \'normal\' : _f, _g = props.origin, origin = _g === void 0 ? [\'center\', \'center\'] : _g, _h = props.right, right = _h === void 0 ? 0 : _h, _j = props.left, left = _j === void 0 ? 0 : _j, _k = props.top, top = _k === void 0 ? 0 : _k, _l = props.rotation, rotation = _l === void 0 ? 0 : _l, _m = props.selectable, selectable = _m === void 0 ? true : _m, rest = IsometricText_rest(props, ["planeView", "text", "fontFamily", "fontSize", "fontStyle", "fontWeight", "origin", "right", "left", "top", "rotation", "selectable"]);\n _this = _super.call(this, rest, SVG_ELEMENTS.group) || this;\n _this._originHash = (_a = {},\n _a[ORIGIN.CENTER] = \'middle\',\n _a[ORIGIN.LEFT] = \'start\',\n _a[ORIGIN.RIGHT] = \'end\',\n _a[ORIGIN.TOP] = \'hanging\',\n _a[ORIGIN.BOTTOM] = \'baseline\',\n _a);\n _this.commonAnimationAttributes = {\n attributeName: \'transform\',\n attributeType: \'XML\',\n additive: \'sum\',\n fill: \'freeze\'\n };\n _this.getMatrixTransform = function (props) {\n var transformMatrix = getPatternTransform(_this.getPositionTransform(props), _this.planeView, 1);\n return "".concat(transformMatrix, " rotate(").concat(_this.rotation, ")");\n };\n _this._textElement = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.text);\n _this._tspan = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.tspan);\n _this._textElement.appendChild(_this._tspan);\n _this.element.appendChild(_this._textElement);\n _this.planeView = planeView;\n _this.fontFamily = fontFamily;\n _this.fontSize = fontSize;\n _this.fontStyle = fontStyle;\n _this.fontWeight = fontWeight;\n _this.selectable = selectable;\n _this.origin = origin;\n _this.right = right;\n _this.left = left;\n _this.top = top;\n _this.rotation = rotation;\n _this.text = text;\n return _this;\n }\n IsometricText.prototype.getPositionTransform = function (props, fromCenter) {\n if (fromCenter === void 0) { fromCenter = true; }\n return getPointFromIsometricPoint(fromCenter\n ? this.data.centerX\n : 0, fromCenter\n ? this.data.centerY\n : 0, {\n r: props.right,\n l: props.left,\n t: props.top\n }, this.data.scale);\n };\n IsometricText.prototype.updateSubClassAnimations = function () {\n var _this = this;\n var props = {\n right: 0,\n left: 0,\n top: 0,\n rotation: 0,\n };\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var property_1 = animation.property;\n var isRotation_1 = property_1 === \'rotation\';\n var commonProps = IsometricText_assign(IsometricText_assign({}, _this.commonAnimationAttributes), { type: isRotation_1\n ? \'rotate\'\n : \'translate\', begin: \'indefinite\' });\n var properties = void 0;\n if (animation.values) {\n if (Array.isArray(animation.values)) {\n properties = IsometricText_assign({ values: animation.values.map(function (value) {\n if (isRotation_1) {\n return "".concat(value);\n }\n else {\n var modifiedArgs = IsometricText_assign({}, props);\n modifiedArgs[property_1] = +value - _this[property_1];\n var coords = _this.getPositionTransform(modifiedArgs, false);\n return "".concat(coords.x, ",").concat(coords.y);\n }\n }).join(\';\') }, commonProps);\n }\n else {\n if (isRotation_1) {\n properties = IsometricText_assign({ values: "".concat(animation.values) }, commonProps);\n }\n else {\n var modifiedArgs = IsometricText_assign({}, props);\n modifiedArgs[property_1] = +animation.values - _this[property_1];\n var coords = _this.getPositionTransform(modifiedArgs, false);\n properties = IsometricText_assign({ values: "".concat(coords.x, ",").concat(coords.y) }, commonProps);\n }\n }\n }\n else {\n if (isRotation_1) {\n properties = IsometricText_assign({ from: "".concat(animation.from), to: "".concat(animation.to) }, commonProps);\n }\n else {\n var fromArgs = IsometricText_assign({}, props);\n var toArgs = IsometricText_assign({}, props);\n fromArgs[property_1] = +animation.from - _this[property_1];\n toArgs[property_1] = +animation.to - _this[property_1];\n var coordsFrom = _this.getPositionTransform(fromArgs, false);\n var coordsTo = _this.getPositionTransform(toArgs, false);\n properties = IsometricText_assign({ from: "".concat(coordsFrom.x, ",").concat(coordsFrom.y), to: "".concat(coordsTo.x, ",").concat(coordsTo.y) }, commonProps);\n }\n }\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animateTransform);\n }\n _this.addAnimationBasicProperties(\'transform\', animation);\n addSVGProperties(animation.element, properties);\n if (!animation.element.parentNode) {\n if (isRotation_1) {\n _this._textElement.appendChild(animation.element);\n }\n else {\n _this.element.appendChild(animation.element);\n }\n }\n window.requestAnimationFrame(function () {\n animation.element.beginElement();\n });\n }\n }\n });\n };\n IsometricText.prototype.update = function () {\n if (elementHasSVGParent(this.element)) {\n var transform = this.getMatrixTransform({\n right: this.right,\n left: this.left,\n top: this.top\n });\n addSVGProperties(this._textElement, { transform: transform });\n this._tspan.textContent = this._text;\n this.updatePatternTransform({ x: 0, y: 0 }, this.planeView);\n this.updateAnimations();\n }\n return this;\n };\n IsometricText.prototype.clear = function () {\n this.text = \'\';\n this.update();\n return this;\n };\n Object.defineProperty(IsometricText.prototype, "text", {\n get: function () {\n return this._text;\n },\n set: function (value) {\n this._text = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "planeView", {\n get: function () {\n return this._planeView;\n },\n set: function (value) {\n this._planeView = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontFamily", {\n get: function () {\n return this._fontFamily;\n },\n set: function (value) {\n this._fontFamily = value;\n addSVGProperties(this._tspan, {\n \'font-family\': this._fontFamily\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontSize", {\n get: function () {\n return this._fontSize;\n },\n set: function (value) {\n this._fontSize = value;\n addSVGProperties(this._tspan, {\n \'font-size\': "".concat(this._fontSize, "px")\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontStyle", {\n get: function () {\n return this._fontStyle;\n },\n set: function (value) {\n this._fontStyle = value;\n addSVGProperties(this._tspan, {\n \'font-style\': "".concat(this._fontStyle)\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontWeight", {\n get: function () {\n return this._fontWeight;\n },\n set: function (value) {\n this._fontWeight = value;\n addSVGProperties(this._tspan, {\n \'font-weight\': "".concat(this._fontWeight)\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "selectable", {\n get: function () {\n return this._selectable;\n },\n set: function (value) {\n this._selectable = value;\n if (this._selectable) {\n this._textElement.removeAttribute(\'style\');\n }\n else {\n addSVGProperties(this._textElement, {\n style: [\n \'-webkit-user-select\',\n \'-moz-user-select\',\n \'-ms-user-select\',\n \'user-select\',\n \'pointer-events\'\n ].map(function (decl) { return "".concat(decl, ": none"); }).join(\';\')\n });\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "origin", {\n get: function () {\n return this._origin;\n },\n set: function (value) {\n this._origin = value;\n var _a = this._origin, textAnchor = _a[0], alignmentBaseline = _a[1];\n addSVGProperties(this._tspan, {\n \'text-anchor\': this._originHash[textAnchor],\n \'alignment-baseline\': this._originHash[alignmentBaseline]\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "right", {\n get: function () {\n return this._right;\n },\n set: function (value) {\n if (this._right !== value) {\n this._right = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "left", {\n get: function () {\n return this._left;\n },\n set: function (value) {\n if (this._left !== value) {\n this._left = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "top", {\n get: function () {\n return this._top;\n },\n set: function (value) {\n if (this._top !== value) {\n this._top = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "rotation", {\n get: function () {\n return this._rotation;\n },\n set: function (value) {\n if (this._rotation !== value) {\n this._rotation = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n return IsometricText;\n}(IsometricGraphicAbstract));\n\n\n;// ./src/@classes/public/IsometricText/index.ts\n\n\n;// ./src/index.ts\n\n\n\n\n\n\n\n\n\n\n;// ./demo/demo1/index.js\n/* harmony default export */ const demo1 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricRectangle, PlaneView } = IsometricModule;\n\n function toggleColor() {\n this.fillColor = this.fillColor === \'white\' ? \'#EEE\' : \'white\';\n }\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonProps = {height: 1, width: 1};\n const topPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.TOP});\n const rightPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.FRONT});\n const leftPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.SIDE});\n\n topPiece.top = 1;\n topPiece.addEventListener(\'click\', toggleColor, true);\n\n rightPiece.right = 1;\n rightPiece.addEventListener(\'click\', toggleColor, true);\n\n leftPiece.left = 1;\n leftPiece.addEventListener(\'click\', toggleColor, true);\n\n cube\n .addChild(topPiece)\n .addChild(rightPiece)\n .addChild(leftPiece);\n\n});\n;// ./demo/demo2/index.js\n/* harmony default export */ const demo2 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath, IsometricRectangle, IsometricPentagram, PlaneView } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonProps = {height: 1, width: 1};\n\n const duration = 3;\n\n const rectangleAnimationProps = {\n property: \'height\',\n duration,\n values: [1, 0.5, 1]\n };\n\n const colorAnimationProps = {\n property: \'fillColor\',\n duration,\n values: [\'#FFF\', \'#DDD\', \'#FFF\']\n };\n\n const topPiece = new IsometricPath();\n const star = new IsometricPentagram({ radius: 0.35, planeView: PlaneView.TOP, right: 0.5, left: 0.5, top: 1});\n const rightPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.FRONT, right: 1});\n const leftPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.SIDE, left: 1});\n\n topPiece\n .moveTo(0, 0, 1)\n .lineTo(1, 0, 1)\n .lineTo(1, 1, 1)\n .lineTo(0, 1, 1);\n\n topPiece\n .addAnimation({\n property: \'path\',\n duration,\n values: [\n \'M0 0 1 L1 0 1 L1 1 1 L0 1 1\',\n \'M0 0 0.5 L1 0 0.5 L1 1 0.5 L0 1 0.5\',\n \'M0 0 1 L1 0 1 L1 1 1 L0 1 1\'\n ]\n })\n .addAnimation(colorAnimationProps);\n\n star\n .addAnimation({\n property: \'top\',\n duration,\n values: [1, 0.5, 1]\n });\n\n rightPiece\n .addAnimation(rectangleAnimationProps)\n .addAnimation(colorAnimationProps);\n\n leftPiece\n .addAnimation(rectangleAnimationProps)\n .addAnimation(colorAnimationProps);\n\n cube.addEventListener(\'click\', function() {\n if (this.animated) {\n this.pauseAnimations();\n } else {\n this.resumeAnimations();\n }\n });\n\n cube.addChildren(topPiece, rightPiece, leftPiece, star);\n\n});\n;// ./demo/images/block_side.png\nconst block_side_namespaceObject = __webpack_require__.p + "images/block_side.png";\n;// ./demo/images/block_top.png\nconst block_top_namespaceObject = __webpack_require__.p + "images/block_top.png";\n;// ./demo/demo3/index.js\n\n\n\n/* harmony default export */ const demo3 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricRectangle, IsometricText, PlaneView } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const rectangleCommonProps = { height: 1, width: 1 };\n\n const textCommonProps = {\n fontSize: 15,\n fillColor: \'#666\',\n strokeWidth: 0,\n right: 0.5,\n left: 0.5,\n top: 0.5,\n selectable: false\n };\n\n const pieces = [PlaneView.TOP, PlaneView.FRONT, PlaneView.SIDE].map((view, index) => {\n return {\n face: new IsometricRectangle({...rectangleCommonProps, planeView: view}),\n label: new IsometricText({...textCommonProps, planeView: view}),\n property: [\'top\', \'right\', \'left\'][index]\n };\n });\n\n pieces.forEach((piece) => {\n\n const { face, label, property } = piece;\n\n face[property] = 1;\n label[property] = 1;\n label.text = `${property.toUpperCase()} 0º`;\n\n face.addEventListener(\'click\', () => {\n const rotation = label.rotation + 45;\n label.rotation = rotation === 360 ? 0 : rotation;\n label.text = label.text.replace(/\\d+/, label.rotation);\n });\n\n cube.addChild(piece.face);\n cube.addChild(piece.label);\n });\n\n});\n;// ./demo/demo4/index.js\n/* harmony default export */ const demo4 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricGroup, IsometricPath } = IsometricModule;\n\n const isometric = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const bottomT = new IsometricPath();\n const bottomR = new IsometricPath();\n const bottomL = new IsometricPath();\n\n const topT = new IsometricPath();\n const topR = new IsometricPath();\n const topL = new IsometricPath();\n\n bottomT.mt(0, 0, .5).lt(1, 0, .5).lt(1, 1, .5).lt(0, 1, .5);\n bottomR.mt(1, 0, .5).lt(1, 0, 0).lt(1, 1, 0).lt(1, 1, .5);\n bottomL.mt(1, 1, .5).lt(1, 1, 0).lt(0, 1, 0).lt(0, 1, .5);\n\n topT.mt(.25, .25, 1).lt(.75, .25, 1).lt(.75, .75, .75).lt(.25, .75, .75);\n topR.mt(.75, .25, 1).lt(.75, .75, .75).lt(.75, .75, .25).lt(.75, .25, .25);\n topL.mt(.75, .75, .75).lt(.25, .75, .75).lt(.25, .75, .25).lt(.75, .75, .25);\n\n const bottomPiece = new IsometricGroup();\n const topPiece = new IsometricGroup();\n topPiece.top = .25;\n\n bottomPiece.addChildren(bottomT, bottomR, bottomL);\n topPiece.addChildren(topT, topR, topL);\n\n let flip = true;\n\n topPiece.addEventListener(\'click\', function() {\n if (this.right) {\n this.right = 0;\n return;\n }\n this.right = flip ? 0.25 : -0.25;\n flip = !flip;\n });\n\n isometric.addChildren(bottomPiece, topPiece);\n\n});\n;// ./demo/demo5/index.js\n/* harmony default export */ const demo5 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath } = IsometricModule;\n\n const isometric = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const right = new IsometricPath();\n const top1 = new IsometricPath();\n const top2 = new IsometricPath();\n const top3 = new IsometricPath();\n const top4 = new IsometricPath();\n const left1 = new IsometricPath();\n const left2 = new IsometricPath();\n\n // M r l t (Move to right left top)\n // L r l t (Line to right left top)\n // C cr cl ct r l t (Curve to control-right control-left control-top right left top)\n right.draw(\'M1 0 0 L1 1 0 L1 1 0.25 L1 0.5 0.25 L1 0.5 1 L1 0 1\');\n top1.draw(\'M0.25 0.5 1 C0.5 0.5 0.75 0.75 0.5 1 L0.75 0 1 C0.5 0 0.75 0.25 0 1 L0.25 0.5 1\');\n top2.draw(\'M1 0 1 L0.75 0 1 L0.75 0.5 1 L1 0.5 1 L1 0 1 M0 0 1 L0.25 0 1 L0.25 0.5 1 L0 0.5 1 L0 0 1\');\n top3.draw(\'M0 0.5 0.5 L0.5 0.5 0.5 L0.5 1 0.5 L0 1 0.5\');\n top4.draw(\'M0.5 0.5 0.5 L1 0.5 0.25 L1 1 0.25 L0.5 1 0.5\');\n left1.draw(\'M0 0.5 1 L0 0.5 0.5 L0.5 0.5 0.5 L1 0.5 0.25 L1 0.5 1 L0.75 0.5 1 C0.5 0.5 0.75 0.25 0.5 1 L0 0.5 1\');\n left2.draw(\'M0 1 0.5 L0.5 1 0.5 L1 1 0.25 L1 1 0 L0 1 0\');\n\n isometric.addChildren(right, top1, top2, top3, top4, left1, left2);\n\n});\n;// ./demo/demo6/index.js\n/* harmony default export */ const demo6 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const under = new IsometricPath({ fillColor: \'#EEE\' });\n const top = new IsometricPath();\n const right = new IsometricPath();\n const left = new IsometricPath();\n\n under\n .mt(0, 0, 1)\n .mt(0.25, 0, 1).ct(0.5, 0, 0.75, 0.75, 0, 1).lt(1, 0, 1)\n .lt(1, 0, 0.75).ct(0.75, 0, 0.5, 1, 0, 0.25).lt(1, 0, 0)\n .lt(1, 0.25, 0).ct(0.75, 0.5, 0, 1, 0.75, 0).lt(1, 1, 0)\n .lt(0.75, 1, 0).ct(0.5, 0.75, 0, 0.25, 1, 0).lt(0, 1, 0)\n .lt(0, 1, 0.25).ct(0, 0.75, 0.5, 0, 1, 0.75).lt(0, 1, 1)\n .lt(0, 0.75, 1).ct(0, 0.5, 0.75, 0, 0.25, 1).lt(0, 0, 1);\n\n top\n .mt(0, 0, 1)\n .lt(0.25, 0, 1).ct(0.5, 0.25, 1, 0.75, 0, 1).lt(1, 0, 1)\n .lt(1, 0.25, 1).ct(0.75, 0.5, 1, 1, 0.75, 1).lt(1, 1, 1)\n .lt(0.75, 1, 1).ct(0.5, 0.75, 1, 0.25, 1, 1).lt(0, 1, 1)\n .lt(0, 0.75, 1).ct(0.25, 0.5, 1, 0, 0.25, 1).lt(0, 0, 1);\n\n right\n .mt(1, 0, 1)\n .lt(1, 0, 0.75).ct(1, 0.25, 0.5, 1, 0, 0.25).lt(1, 0, 0)\n .lt(1, 0.25, 0).ct(1, 0.5, 0.25, 1, 0.75, 0).lt(1, 1, 0)\n .lt(1, 1, 0.25).ct(1, 0.75, 0.5, 1, 1, 0.75).lt(1, 1, 1)\n .lt(1, 0.75, 1).ct(1, 0.5, 0.75, 1, 0.25, 1).lt(1, 0, 1);\n\n left\n .mt(1, 1, 1)\n .lt(1, 1, 0.75).ct(0.75, 1, 0.5, 1, 1, 0.25).lt(1, 1, 0)\n .lt(0.75, 1, 0).ct(0.5, 1, 0.25, 0.25, 1, 0).lt(0, 1, 0)\n .lt(0, 1, 0.25).ct(0.25, 1, 0.5, 0, 1, 0.75).lt(0, 1, 1)\n .lt(0.25, 1, 1).ct(0.5, 1, 0.75, 0.75, 1, 1).lt(1, 1, 1);\n\n cube.addChildren(under, top, right, left);\n\n});\n;// ./demo/demo7/index.js\n/* harmony default export */ const demo7 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricStarPolygon, PlaneView } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonProps = {\n radius: 0.5,\n points: 8,\n density: 2,\n right: 0.5,\n left: 0.5,\n top: 0.5\n };\n\n const planes = [PlaneView.SIDE, PlaneView.FRONT, PlaneView.TOP];\n\n const planePropsHash = {\n [PlaneView.TOP]: \'top\',\n [PlaneView.FRONT]: \'right\',\n [PlaneView.SIDE]: \'left\'\n };\n\n planes.forEach((planeView) => {\n const props = { ...commonProps, planeView };\n const coord = planePropsHash[planeView];\n const starPolygonBack = new IsometricStarPolygon({...props, id: `${coord}-back`, fillColor: \'#EEE\'});\n const starPolygonFront = new IsometricStarPolygon({...props, id: `${coord}-front`});\n starPolygonBack[coord] = 0;\n starPolygonFront[coord] = 1;\n cube.addChildren(starPolygonBack, starPolygonFront);\n });\n\n planes.forEach((planeView) => {\n const coord = planePropsHash[planeView];\n const starPolygonBack = cube.getChildById(`${coord}-back`);\n const starPolygonFront = cube.getChildById(`${coord}-front`);\n cube.sendChildToBack(starPolygonBack);\n cube.bringChildToFront(starPolygonFront);\n });\n\n});\n;// ./demo/demo8/index.js\n/* harmony default export */ const demo8 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricGroup, IsometricRectangle, PlaneView } = IsometricModule;\n\n const canvas = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 20,\n width: 500,\n height: 320\n });\n\n function resetPlanes() {\n cube.right = cube.left = cube.top = 0;\n planeTop.fillOpacity = planeRight.fillOpacity = planeLeft.fillOpacity = 0.25;\n }\n\n function changePlane() {\n resetPlanes();\n this.fillOpacity = 1;\n cube.drag = this.planeView;\n }\n\n const planeProps = { height: 6, width: 6, fillOpacity: 0.25 };\n const planeTop = new IsometricRectangle({ ...planeProps, planeView: PlaneView.TOP, fillOpacity: 1 });\n const planeRight = new IsometricRectangle({ ...planeProps, planeView: PlaneView.FRONT });\n const planeLeft = new IsometricRectangle({ ...planeProps, planeView: PlaneView.SIDE });\n\n const cubeProps = { height: 1, width: 1 };\n const cubeTop = new IsometricRectangle({ ...cubeProps, planeView: PlaneView.TOP, top: 1 });\n const cubeRight = new IsometricRectangle({ ...cubeProps, planeView: PlaneView.FRONT, right: 1 });\n const cubeLeft = new IsometricRectangle({ ...cubeProps, planeView: PlaneView.SIDE, left: 1 });\n\n const cube = new IsometricGroup();\n\n const bounds = [0, 5];\n cube.drag = \'TOP\';\n cube.bounds = { top: bounds, right: bounds, left: bounds };\n\n planeTop.addEventListener(\'click\', changePlane, true);\n planeRight.addEventListener(\'click\', changePlane, true);\n planeLeft.addEventListener(\'click\', changePlane, true);\n\n cube.addChildren(cubeTop, cubeRight, cubeLeft);\n canvas.addChildren(planeTop, planeRight, planeLeft, cube);\n\n});\n;// ./demo/demo9/index.js\n\n\n\n/* harmony default export */ const demo9 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath, IsometricRectangle, PlaneView, Axis } = IsometricModule;\n\n const isometric = new IsometricCanvas({\n container,\n backgroundColor: \'#8AAA3F\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonTextureProps = {\n height: 1,\n width: 1,\n pixelated: true\n };\n\n const textureSides = {\n url: \'images/block_side.png\',\n ...commonTextureProps\n };\n\n const textureTop = {\n url: \'images/block_top.png\',\n planeView: PlaneView.TOP,\n rotation: {\n axis: Axis.LEFT,\n value: 26.5650\n },\n ...commonTextureProps\n };\n\n const side = new IsometricPath({\n texture: {\n planeView: PlaneView.SIDE,\n ...textureSides\n }\n });\n\n const front = new IsometricRectangle({\n planeView: PlaneView.FRONT,\n height: 0.5,\n width: 1,\n texture: textureSides\n });\n\n const chop = new IsometricPath({\n texture: textureTop\n });\n\n side.draw(\'M1 1 0 L1 1 0.5 L0 1 1 L0 1 0\');\n chop.draw(\'M1 1 0.5 L0 1 1 L0 0 1 L1 0 0.5\');\n\n side.left = 1;\n front.right = 1;\n\n isometric.addChildren(side, front, chop);\n\n});\n;// ./demo/demo.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst functioToString = (fn) => {\n const article = document.createElement(\'article\');\n const pre = document.createElement(\'pre\');\n article.classList.add(\'function-container\');\n pre.classList.add(\'prettyprint\');\n article.appendChild(pre);\n pre.innerHTML = fn.toString();\n return article;\n};\n\nconst demos = new Map([\n [\'demo1\', demo1],\n [\'demo2\', demo2],\n [\'demo3\', demo3],\n [\'demo4\', demo4],\n [\'demo5\', demo5],\n [\'demo6\', demo6],\n [\'demo7\', demo7],\n [\'demo8\', demo8],\n [\'demo9\', demo9],\n]);\n\ndocument.addEventListener(\'DOMContentLoaded\', function () {\n\n demos.forEach((module, div) => {\n const demo = document.getElementById(div);\n const container = document.createElement(\'div\');\n const wrapper = document.createElement(\'div\');\n\n container.classList.add(\'demo-container\');\n wrapper.classList.add(\'demo-wrapper\');\n\n module(src_namespaceObject, wrapper);\n container.appendChild(wrapper);\n demo.appendChild(container);\n demo.appendChild(functioToString(module));\n });\n\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxFOztBQzlEa0Q7QUFDZ0I7QUFDdkM7QUFDTDtBQUNtQjtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLG1CQUFlO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY29uc3RhbnRzL2luZGV4LnRzPzdjNjUiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0B1dGlscy9tYXRoLnRzPzIwYjIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0B1dGlscy9tYXRyaXgudHM/Mjk1YiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQHV0aWxzL3N2Zy50cz9mNWI4Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9Ac3RvcmUvaW5kZXgudHM/YmU4OSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU3RvcmUvSXNvbWV0cmljU3RvcmUudHM/NjZlOSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU3RvcmUvaW5kZXgudHM/ZGJiOCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljRWxlbWVudEFic3RyYWN0L0lzb21ldHJpY0VsZW1lbnRBYnN0cmFjdC50cz9lZjUzIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNFbGVtZW50QWJzdHJhY3QvaW5kZXgudHM/ODI4ZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0L0lzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC50cz83YjY5Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNHcmFwaGljQWJzdHJhY3QvaW5kZXgudHM/OTIyOSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QudHM/ZmQyZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QvaW5kZXgudHM/YTMwMyIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY0NhbnZhcy9Jc29tZXRyaWNDYW52YXMudHM/OTViOCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY0NhbnZhcy9pbmRleC50cz9jNTdiIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AdXRpbHMvb3RoZXIudHM/NDE1NyIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QvY29uc3RhbnRzLnRzP2RhNDYiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnRzPzU2ZTYiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0L2luZGV4LnRzP2ViMWEiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNHcm91cC9Jc29tZXRyaWNHcm91cC50cz9hZThlIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljR3JvdXAvaW5kZXgudHM/NDQ5MyIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljUGF0aEFic3RyYWN0L0lzb21ldHJpY1BhdGhBYnN0cmFjdC50cz8yN2E5Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNQYXRoQWJzdHJhY3QvaW5kZXgudHM/OGFkZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU2hhcGVBYnN0cmFjdC9Jc29tZXRyaWNTaGFwZUFic3RyYWN0LnRzPzdmNzUiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1NoYXBlQWJzdHJhY3QvaW5kZXgudHM/NDEzZSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1JlY3RhbmdsZS9Jc29tZXRyaWNSZWN0YW5nbGUudHM/ZGFiZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1JlY3RhbmdsZS9pbmRleC50cz8yYmYzIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljQ2lyY2xlL0lzb21ldHJpY0NpcmNsZS50cz9hZGE4Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljQ2lyY2xlL2luZGV4LnRzPzViZTgiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QvSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC50cz8wYmQ3Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0L2luZGV4LnRzPzgyOTciLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNQZW50YWdyYW0vSXNvbWV0cmljUGVudGFncmFtLnRzPzZkNjgiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNQZW50YWdyYW0vaW5kZXgudHM/YWE2MSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1N0YXJQb2x5Z29uL0lzb21ldHJpY1N0YXJQb2x5Z29uLnRzP2Y3NDIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNTdGFyUG9seWdvbi9pbmRleC50cz9iNDJhIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljUGF0aC9Jc29tZXRyaWNQYXRoLnRzPzQ2MmYiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNQYXRoL2luZGV4LnRzP2QwNGIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNUZXh0L0lzb21ldHJpY1RleHQudHM/MGMxMiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1RleHQvaW5kZXgudHM/MGY2OSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvaW5kZXgudHM/ZDllMSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW8xL2luZGV4LmpzPzhlMTMiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vZGVtby9kZW1vMi9pbmRleC5qcz83YjZkIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL2RlbW8vZGVtbzMvaW5kZXguanM/NmQ4NyIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW80L2luZGV4LmpzPzQ1YWQiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vZGVtby9kZW1vNS9pbmRleC5qcz9iNGIxIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL2RlbW8vZGVtbzYvaW5kZXguanM/ZmRhNSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW83L2luZGV4LmpzPzBhZmIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vZGVtby9kZW1vOC9pbmRleC5qcz80YzA3Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL2RlbW8vZGVtbzkvaW5kZXguanM/MjE3NiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW8uanM/ZmNkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuZXhwb3J0IHZhciBTVkdfRUxFTUVOVFM7XG4oZnVuY3Rpb24gKFNWR19FTEVNRU5UUykge1xuICAgIFNWR19FTEVNRU5UU1tcInN2Z1wiXSA9IFwic3ZnXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wiZ3JvdXBcIl0gPSBcImdcIjtcbiAgICBTVkdfRUxFTUVOVFNbXCJwYXRoXCJdID0gXCJwYXRoXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wicmVjdFwiXSA9IFwicmVjdFwiO1xuICAgIFNWR19FTEVNRU5UU1tcInRleHRcIl0gPSBcInRleHRcIjtcbiAgICBTVkdfRUxFTUVOVFNbXCJ0c3BhblwiXSA9IFwidHNwYW5cIjtcbiAgICBTVkdfRUxFTUVOVFNbXCJwYXR0ZXJuXCJdID0gXCJwYXR0ZXJuXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wiaW1hZ2VcIl0gPSBcImltYWdlXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wiYW5pbWF0ZVwiXSA9IFwiYW5pbWF0ZVwiO1xuICAgIFNWR19FTEVNRU5UU1tcImFuaW1hdGVUcmFuc2Zvcm1cIl0gPSBcImFuaW1hdGVUcmFuc2Zvcm1cIjtcbn0pKFNWR19FTEVNRU5UUyB8fCAoU1ZHX0VMRU1FTlRTID0ge30pKTtcbmV4cG9ydCB2YXIgU1ZHX1BST1BFUlRJRVM7XG4oZnVuY3Rpb24gKFNWR19QUk9QRVJUSUVTKSB7XG4gICAgU1ZHX1BST1BFUlRJRVNbXCJ2aWV3Qm94XCJdID0gXCJ2aWV3Qm94XCI7XG59KShTVkdfUFJPUEVSVElFUyB8fCAoU1ZHX1BST1BFUlRJRVMgPSB7fSkpO1xuZXhwb3J0IHZhciBERUNJTUFMUyA9IDY7XG5leHBvcnQgdmFyIFNRUlQzID0gKyhNYXRoLnNxcnQoMykudG9GaXhlZChERUNJTUFMUykpO1xuZXhwb3J0IHZhciBIU1FSVDMgPSArKChNYXRoLnNxcnQoMykgLyAyKS50b0ZpeGVkKERFQ0lNQUxTKSk7XG5leHBvcnQgdmFyIERFRkFVTFRfV0lEVEggPSA2NDA7XG5leHBvcnQgdmFyIERFRkFVTFRfSEVJR0hUID0gNDgwO1xudmFyIE4gPSAnKC0/XFxcXGQrKD86XFxcXC5cXFxcZCspP3wtP1xcXFwuXFxcXGQrKSc7XG52YXIgUyA9ICdcXFxccyonO1xudmFyIFNTID0gJ1xcXFxzKyc7XG52YXIgUE9JTlQgPSBcIlwiLmNvbmNhdChOKS5jb25jYXQoU1MpLmNvbmNhdChOKS5jb25jYXQoU1MpLmNvbmNhdChOKTtcbnZhciBDVVJWRSA9IFwiXCIuY29uY2F0KFBPSU5UKS5jb25jYXQoU1MpLmNvbmNhdChQT0lOVCk7XG5leHBvcnQgdmFyIENPTU1BTkRTX1JFR0VYUCA9IG5ldyBSZWdFeHAoXCIoPzooTXxMKVwiLmNvbmNhdChTKS5jb25jYXQoUE9JTlQpLmNvbmNhdChTLCBcInwoQylcIikuY29uY2F0KFMpLmNvbmNhdChDVVJWRSwgXCIpXCIpLmNvbmNhdChTKSwgJ2cnKTtcbmV4cG9ydCB2YXIgU0NBTEUgPSBNYXRoLnNxcnQoMyAvIDIpO1xuZXhwb3J0IHZhciBST1RfNjAgPSBNYXRoLlBJIC8gMztcbmV4cG9ydCB2YXIgUk9UXzQ1ID0gTWF0aC5QSSAvIDQ7XG5leHBvcnQgdmFyIFJPVF9DTUEgPSBNYXRoLmF0YW4oTWF0aC5TUVJUMik7XG5leHBvcnQgdmFyIENvbG9ycztcbihmdW5jdGlvbiAoQ29sb3JzKSB7XG4gICAgQ29sb3JzW1wid2hpdGVcIl0gPSBcIndoaXRlXCI7XG4gICAgQ29sb3JzW1wiYmxhY2tcIl0gPSBcImJsYWNrXCI7XG59KShDb2xvcnMgfHwgKENvbG9ycyA9IHt9KSk7XG5leHBvcnQgdmFyIExpbmVDYXA7XG4oZnVuY3Rpb24gKExpbmVDYXApIHtcbiAgICBMaW5lQ2FwW1wiYnV0dFwiXSA9IFwiYnV0dFwiO1xuICAgIExpbmVDYXBbXCJzcXVhcmVcIl0gPSBcInNxdWFyZVwiO1xuICAgIExpbmVDYXBbXCJyb3VuZFwiXSA9IFwicm91bmRcIjtcbn0pKExpbmVDYXAgfHwgKExpbmVDYXAgPSB7fSkpO1xuZXhwb3J0IHZhciBMaW5lSm9pbjtcbihmdW5jdGlvbiAoTGluZUpvaW4pIHtcbiAgICBMaW5lSm9pbltcIm1pdGVyXCJdID0gXCJtaXRlclwiO1xuICAgIExpbmVKb2luW1wicm91bmRcIl0gPSBcInJvdW5kXCI7XG4gICAgTGluZUpvaW5bXCJiZXZlbFwiXSA9IFwiYmV2ZWxcIjtcbn0pKExpbmVKb2luIHx8IChMaW5lSm9pbiA9IHt9KSk7XG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICBDb21tYW5kW1wibW92ZVwiXSA9IFwibW92ZVwiO1xuICAgIENvbW1hbmRbXCJsaW5lXCJdID0gXCJsaW5lXCI7XG4gICAgQ29tbWFuZFtcImN1cnZlXCJdID0gXCJjdXJ2ZVwiO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG5leHBvcnQgdmFyIFBsYW5lVmlldztcbihmdW5jdGlvbiAoUGxhbmVWaWV3KSB7XG4gICAgUGxhbmVWaWV3W1wiRlJPTlRcIl0gPSBcIkZST05UXCI7XG4gICAgUGxhbmVWaWV3W1wiU0lERVwiXSA9IFwiU0lERVwiO1xuICAgIFBsYW5lVmlld1tcIlRPUFwiXSA9IFwiVE9QXCI7XG59KShQbGFuZVZpZXcgfHwgKFBsYW5lVmlldyA9IHt9KSk7XG5leHBvcnQgdmFyIEF4aXM7XG4oZnVuY3Rpb24gKEF4aXMpIHtcbiAgICBBeGlzW1wiUklHSFRcIl0gPSBcIlJJR0hUXCI7XG4gICAgQXhpc1tcIkxFRlRcIl0gPSBcIkxFRlRcIjtcbiAgICBBeGlzW1wiVE9QXCJdID0gXCJUT1BcIjtcbn0pKEF4aXMgfHwgKEF4aXMgPSB7fSkpO1xuZXhwb3J0IHZhciBUeXBlb2Y7XG4oZnVuY3Rpb24gKFR5cGVvZikge1xuICAgIFR5cGVvZltcIlVOREVGSU5FRFwiXSA9IFwidW5kZWZpbmVkXCI7XG4gICAgVHlwZW9mW1wiTlVNQkVSXCJdID0gXCJudW1iZXJcIjtcbn0pKFR5cGVvZiB8fCAoVHlwZW9mID0ge30pKTtcbmV4cG9ydCB2YXIgRVZFTlRTO1xuKGZ1bmN0aW9uIChFVkVOVFMpIHtcbiAgICBFVkVOVFNbXCJNT1VTRV9NT1ZFXCJdID0gXCJtb3VzZW1vdmVcIjtcbiAgICBFVkVOVFNbXCJNT1VTRV9ET1dOXCJdID0gXCJtb3VzZWRvd25cIjtcbiAgICBFVkVOVFNbXCJNT1VTRV9VUFwiXSA9IFwibW91c2V1cFwiO1xuICAgIEVWRU5UU1tcIlRPVUNIX1NUQVJUXCJdID0gXCJ0b3VjaHN0YXJ0XCI7XG4gICAgRVZFTlRTW1wiVE9VQ0hfTU9WRVwiXSA9IFwidG91Y2htb3ZlXCI7XG4gICAgRVZFTlRTW1wiVE9VQ0hfRU5EXCJdID0gXCJ0b3VjaGVuZFwiO1xufSkoRVZFTlRTIHx8IChFVkVOVFMgPSB7fSkpO1xuZXhwb3J0IHZhciBPUklHSU47XG4oZnVuY3Rpb24gKE9SSUdJTikge1xuICAgIE9SSUdJTltcIkNFTlRFUlwiXSA9IFwiY2VudGVyXCI7XG4gICAgT1JJR0lOW1wiTEVGVFwiXSA9IFwibGVmdFwiO1xuICAgIE9SSUdJTltcIlJJR0hUXCJdID0gXCJyaWdodFwiO1xuICAgIE9SSUdJTltcIlRPUFwiXSA9IFwidG9wXCI7XG4gICAgT1JJR0lOW1wiQk9UVE9NXCJdID0gXCJib3R0b21cIjtcbn0pKE9SSUdJTiB8fCAoT1JJR0lOID0ge30pKTtcbiIsImltcG9ydCB7IEhTUVJUMywgREVDSU1BTFMgfSBmcm9tICdAY29uc3RhbnRzJztcbmV4cG9ydCB2YXIgcm91bmQgPSBmdW5jdGlvbiAobiwgZCkge1xuICAgIHZhciBleHAgPSBNYXRoLnBvdygxMCwgZCk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobiAqIGV4cCkgLyBleHA7XG59O1xuZXhwb3J0IHZhciByYWRpYW4gPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSAqIE1hdGguUEkgLyAxODA7IH07XG5leHBvcnQgdmFyIHNpbmNvcyA9IGZ1bmN0aW9uIChyKSB7IHJldHVybiAoe1xuICAgIHNpbjogcm91bmQoTWF0aC5zaW4ociksIERFQ0lNQUxTKSxcbiAgICBjb3M6IHJvdW5kKE1hdGguY29zKHIpLCBERUNJTUFMUylcbn0pOyB9O1xudmFyIGdldFBvaW50c0RpZmYgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIpIHsgcmV0dXJuICh7XG4gICAgeDogcG9pbnRBLnggLSBwb2ludEIueCxcbiAgICB5OiBwb2ludEEueSAtIHBvaW50Qi55XG59KTsgfTtcbnZhciBnZXRQb2ludHNEaXN0YW5jZSA9IGZ1bmN0aW9uIChwb2ludEEsIHBvaW50Qikge1xuICAgIHZhciBkaWZmID0gZ2V0UG9pbnRzRGlmZihwb2ludEEsIHBvaW50Qik7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhkaWZmLngsIDIpICsgTWF0aC5wb3coZGlmZi55LCAyKSk7XG59O1xudmFyIHRyYW5zbGF0ZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBhbmdsZSwgZGlzdGFuY2UpIHsgcmV0dXJuICh7XG4gICAgeDogcG9pbnQueCArIE1hdGguY29zKGFuZ2xlKSAqIGRpc3RhbmNlLFxuICAgIHk6IHBvaW50LnkgKyBNYXRoLnNpbihhbmdsZSkgKiBkaXN0YW5jZVxufSk7IH07XG52YXIgcm90YXRlID0gZnVuY3Rpb24gKHBvaW50LCBjZW50ZXIsIGFuZ2xlKSB7XG4gICAgdmFyIGRpZmYgPSBnZXRQb2ludHNEaWZmKHBvaW50LCBjZW50ZXIpO1xuICAgIHZhciB4ID0gZGlmZi54ICogTWF0aC5jb3MoYW5nbGUpIC0gZGlmZi55ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgIHZhciB5ID0gZGlmZi54ICogTWF0aC5zaW4oYW5nbGUpICsgZGlmZi55ICogTWF0aC5jb3MoYW5nbGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgeCxcbiAgICAgICAgeTogY2VudGVyLnkgKyB5XG4gICAgfTtcbn07XG52YXIgZ2V0UG9pbnRzQW5nbGUgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIpIHtcbiAgICB2YXIgZGlmZiA9IGdldFBvaW50c0RpZmYocG9pbnRCLCBwb2ludEEpO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKGRpZmYueSwgZGlmZi54KTtcbn07XG5leHBvcnQgdmFyIGdldE9yaWVudGF0aW9uID0gZnVuY3Rpb24gKHAxLCBwMiwgcDMpIHtcbiAgICB2YXIgdmFsdWUgPSAocDIueSAtIHAxLnkpICogKHAzLnggLSBwMi54KSAtIChwMi54IC0gcDEueCkgKiAocDMueSAtIHAyLnkpO1xuICAgIHJldHVybiB2YWx1ZSA+PSAwID8gMCA6IDE7XG59O1xuZXhwb3J0IHZhciBnZXRQb2ludEZyb21Jc29tZXRyaWNQb2ludCA9IGZ1bmN0aW9uIChjZW50ZXJYLCBjZW50ZXJZLCBwb2ludCwgc2NhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByb3VuZChjZW50ZXJYICsgKHBvaW50LnIgLSBwb2ludC5sKSAqIHNjYWxlICogSFNRUlQzLCBERUNJTUFMUyksXG4gICAgICAgIHk6IHJvdW5kKGNlbnRlclkgKyAoKHBvaW50LnIgKyBwb2ludC5sKSAvIDIgLSBwb2ludC50KSAqIHNjYWxlLCBERUNJTUFMUylcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0VG9wUGxhbmVQb2ludEZyb21Db29yZGluYXRlcyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIFhIU1FSVDMgPSB4IC8gSFNRUlQzO1xuICAgIHZhciByaWdodCA9ICh5ICogMiArIFhIU1FSVDMpIC8gMjtcbiAgICB2YXIgbGVmdCA9IHJpZ2h0IC0gWEhTUVJUMztcbiAgICByZXR1cm4ge1xuICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgIGxlZnQ6IGxlZnRcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0RnJvbnRQbGFuZVBvaW50RnJvbUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICB2YXIgbGVmdCA9IC14IC8gSFNRUlQzO1xuICAgIHZhciB0b3AgPSBsZWZ0IC8gMiAtIHk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgdG9wOiB0b3BcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0U2lkZVBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHZhciByaWdodCA9IHggLyBIU1FSVDM7XG4gICAgdmFyIHRvcCA9IHJpZ2h0IC8gMiAtIHk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICB0b3A6IHRvcFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBnZXRFbGxpcHNpc1NwZWNzID0gZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCLCBjb250cm9sKSB7XG4gICAgdmFyIGRpZmYgPSBnZXRQb2ludHNEaWZmKHBvaW50QiwgcG9pbnRBKTtcbiAgICB2YXIgY2VudGVyID0geyB4OiBwb2ludEEueCArIGRpZmYueCAvIDIsIHk6IHBvaW50QS55ICsgZGlmZi55IC8gMiB9O1xuICAgIHZhciBQID0gcm90YXRlKHBvaW50QiwgY2VudGVyLCBNYXRoLlBJIC8gMik7XG4gICAgdmFyIEQgPSB7IHg6IFAueCArIChjb250cm9sLnggLSBQLngpIC8gMiwgeTogUC55ICsgKGNvbnRyb2wueSAtIFAueSkgLyAyIH07XG4gICAgdmFyIHJhZGl1cyA9IGdldFBvaW50c0Rpc3RhbmNlKEQsIGNlbnRlcik7XG4gICAgdmFyIFUgPSB0cmFuc2xhdGVQb2ludChELCBnZXRQb2ludHNBbmdsZShELCBQKSwgcmFkaXVzKTtcbiAgICB2YXIgViA9IHRyYW5zbGF0ZVBvaW50KEQsIGdldFBvaW50c0FuZ2xlKEQsIGNvbnRyb2wpLCByYWRpdXMpO1xuICAgIHJldHVybiBbXG4gICAgICAgIHJvdW5kKGdldFBvaW50c0Rpc3RhbmNlKGNvbnRyb2wsIFUpLCBERUNJTUFMUyksXG4gICAgICAgIHJvdW5kKGdldFBvaW50c0Rpc3RhbmNlKGNvbnRyb2wsIFYpLCBERUNJTUFMUyksXG4gICAgICAgIHJvdW5kKGdldFBvaW50c0FuZ2xlKGNlbnRlciwgVikgKiAxODAgLyBNYXRoLlBJLCBERUNJTUFMUylcbiAgICBdO1xufTtcbnZhciByYW5kb21JZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpOyB9O1xuZXhwb3J0IHZhciB1dWlkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gQXJyYXkuZnJvbShBcnJheSgzKSkubWFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJhbmRvbUlkKCk7IH0pLmpvaW4oJy0nKTsgfTtcbiIsInZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IFBsYW5lVmlldywgQXhpcywgUk9UXzQ1LCBST1RfNjAsIFJPVF9DTUEgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IHNpbmNvcywgcmFkaWFuIH0gZnJvbSAnQHV0aWxzL21hdGgnO1xudmFyIG11bHRpcGx5TWF0cml4ID0gZnVuY3Rpb24gKG0xLCBtMikgeyByZXR1cm4gKG0xLm1hcChmdW5jdGlvbiAocm93LCBpKSB7IHJldHVybiAobTJbMF0ubWFwKGZ1bmN0aW9uIChfLCBqKSB7XG4gICAgcmV0dXJuIHJvdy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgXywgbikge1xuICAgICAgICByZXR1cm4gYWNjICsgbTFbaV1bbl0gKiBtMltuXVtqXTtcbiAgICB9LCAwKTtcbn0pKTsgfSkpOyB9O1xudmFyIG11bHRpcGx5TWF0cmljZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG0gPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBtW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBtYXRyaXggPSBtWzBdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXRyaXggPSBtdWx0aXBseU1hdHJpeChtYXRyaXgsIG1baV0pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0cml4O1xufTtcbnZhciByb3RhdGVYID0gZnVuY3Rpb24gKHIpIHtcbiAgICB2YXIgc2MgPSBzaW5jb3Mocik7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgWzEsIDAsIDBdLFxuICAgICAgICBbMCwgc2MuY29zLCAtc2Muc2luXSxcbiAgICAgICAgWzAsIHNjLnNpbiwgc2MuY29zXVxuICAgIF07XG59O1xudmFyIHJvdGF0ZVkgPSBmdW5jdGlvbiAocikge1xuICAgIHZhciBzYyA9IHNpbmNvcyhyKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBbc2MuY29zLCAwLCBzYy5zaW5dLFxuICAgICAgICBbMCwgMSwgMF0sXG4gICAgICAgIFstc2Muc2luLCAwLCBzYy5jb3NdXG4gICAgXTtcbn07XG52YXIgcm90YXRlWiA9IGZ1bmN0aW9uIChyKSB7XG4gICAgdmFyIHNjID0gc2luY29zKHIpO1xuICAgIHJldHVybiBbXG4gICAgICAgIFtzYy5jb3MsIC1zYy5zaW4sIDBdLFxuICAgICAgICBbc2Muc2luLCBzYy5jb3MsIDBdLFxuICAgICAgICBbMCwgMCwgMV1cbiAgICBdO1xufTtcbnZhciB0b3BNYXRyaXggPSBtdWx0aXBseU1hdHJpY2VzKHJvdGF0ZVgoUk9UX0NNQSksIHJvdGF0ZVooLVJPVF80NSkpO1xudmFyIGZyb250TWF0cml4ID0gbXVsdGlwbHlNYXRyaWNlcyhyb3RhdGVaKC1ST1RfNjApLCByb3RhdGVYKFJPVF9DTUEpLCByb3RhdGVaKFJPVF80NSkpO1xudmFyIHNpZGVNYXRyaXggPSBtdWx0aXBseU1hdHJpY2VzKHJvdGF0ZVooUk9UXzYwKSwgcm90YXRlWChST1RfQ01BKSwgcm90YXRlWigtUk9UXzQ1KSk7XG52YXIgcm90YXRpb25Ub1JvdGF0aW9uTWF0cml4ID0gZnVuY3Rpb24gKHZpZXcsIHJvdGF0aW9uKSB7XG4gICAgdmFyIHZhbHVlID0gcmFkaWFuKHJvdGF0aW9uLnZhbHVlKTtcbiAgICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAgICAgY2FzZSBQbGFuZVZpZXcuVE9QOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJvdGF0aW9uLmF4aXMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEF4aXMuVE9QOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm90YXRlWih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBBeGlzLkxFRlQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3RhdGVYKC12YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBBeGlzLlJJR0hUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm90YXRlWSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQbGFuZVZpZXcuRlJPTlQ6IHtcbiAgICAgICAgICAgIHN3aXRjaCAocm90YXRpb24uYXhpcykge1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5UT1A6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3RhdGVZKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIEF4aXMuTEVGVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVgodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5SSUdIVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVoodmFsdWUpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGxhbmVWaWV3LlNJREU6IHtcbiAgICAgICAgICAgIHN3aXRjaCAocm90YXRpb24uYXhpcykge1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5UT1A6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3RhdGVZKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIEF4aXMuTEVGVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVoodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5SSUdIVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVgoLXZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgZ2V0Vmlld01hdHJpeCA9IGZ1bmN0aW9uIChwbGFuZVZpZXcsIHJvdGF0aW9uKSB7XG4gICAgdmFyIHJvdGF0aW9uTWF0cmljZXMgPSBbXTtcbiAgICB2YXIgcm90YXRpb25NYXRyaXggPSByb3RhdGlvblxuICAgICAgICA/IHJvdGF0aW9uVG9Sb3RhdGlvbk1hdHJpeChwbGFuZVZpZXcsIHJvdGF0aW9uKVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKHJvdGF0aW9uTWF0cml4KVxuICAgICAgICByb3RhdGlvbk1hdHJpY2VzLnB1c2gocm90YXRpb25NYXRyaXgpO1xuICAgIHN3aXRjaCAocGxhbmVWaWV3KSB7XG4gICAgICAgIGNhc2UgUGxhbmVWaWV3LlRPUDoge1xuICAgICAgICAgICAgcmV0dXJuIG11bHRpcGx5TWF0cmljZXMuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFt0b3BNYXRyaXhdLCByb3RhdGlvbk1hdHJpY2VzLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGxhbmVWaWV3LkZST05UOiB7XG4gICAgICAgICAgICByZXR1cm4gbXVsdGlwbHlNYXRyaWNlcy5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2Zyb250TWF0cml4XSwgcm90YXRpb25NYXRyaWNlcywgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFBsYW5lVmlldy5TSURFOiB7XG4gICAgICAgICAgICByZXR1cm4gbXVsdGlwbHlNYXRyaWNlcy5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW3NpZGVNYXRyaXhdLCByb3RhdGlvbk1hdHJpY2VzLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbiIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBDT01NQU5EU19SRUdFWFAsIENvbW1hbmQsIERFQ0lNQUxTLCBTQ0FMRSB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0UG9pbnRGcm9tSXNvbWV0cmljUG9pbnQsIGdldEVsbGlwc2lzU3BlY3MsIGdldE9yaWVudGF0aW9uLCByb3VuZCB9IGZyb20gJ0B1dGlscy9tYXRoJztcbmltcG9ydCB7IGdldFZpZXdNYXRyaXggfSBmcm9tICdAdXRpbHMvbWF0cml4JztcbmV4cG9ydCB2YXIgYWRkU1ZHUHJvcGVydGllcyA9IGZ1bmN0aW9uIChzdmcsIHByb3BzKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsIHByb3AsIHByb3BzW3Byb3BdKTtcbiAgICB9KTtcbn07XG52YXIgZ2V0Q29tbWFuZHNXaXRoU3RhcnQgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgICByZXR1cm4gY29tbWFuZHMubGVuZ3RoID09PSAwIHx8IGNvbW1hbmRzWzBdLmNvbW1hbmQgPT09IENvbW1hbmQubW92ZVxuICAgICAgICA/IF9fc3ByZWFkQXJyYXkoW10sIGNvbW1hbmRzLCB0cnVlKSA6IF9fc3ByZWFkQXJyYXkoW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICBwb2ludDogeyByOiAwLCBsOiAwLCB0OiAwIH1cbiAgICAgICAgfVxuICAgIF0sIGNvbW1hbmRzLCB0cnVlKTtcbn07XG5leHBvcnQgdmFyIGdldFNWR1BhdGggPSBmdW5jdGlvbiAoY29tbWFuZHMsIGNlbnRlclgsIGNlbnRlclksIHNjYWxlLCBhdXRvY2xvc2UpIHtcbiAgICB2YXIgZHJhd0NvbW1hbmRzID0gZ2V0Q29tbWFuZHNXaXRoU3RhcnQoY29tbWFuZHMpO1xuICAgIHZhciBzdmdQYXRocyA9IGRyYXdDb21tYW5kcy5tYXAoZnVuY3Rpb24gKGMsIGluZGV4KSB7XG4gICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGMucG9pbnQsIHNjYWxlKTtcbiAgICAgICAgc3dpdGNoIChjLmNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZC5tb3ZlOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIk1cIi5jb25jYXQocG9pbnQueCwgXCIgXCIpLmNvbmNhdChwb2ludC55KTtcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZC5saW5lOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIkxcIi5jb25jYXQocG9pbnQueCwgXCIgXCIpLmNvbmNhdChwb2ludC55KTtcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZC5jdXJ2ZToge1xuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGNvbW1hbmRzW2luZGV4IC0gMV0ucG9pbnQsIHNjYWxlKTtcbiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGMuY29udHJvbCwgc2NhbGUpO1xuICAgICAgICAgICAgICAgIHZhciBlbGxpcHNpc1NwZWNzID0gZ2V0RWxsaXBzaXNTcGVjcyhzdGFydCwgcG9pbnQsIGNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIHZhciBzd2VlcEZsYWcgPSBnZXRPcmllbnRhdGlvbihzdGFydCwgY29udHJvbCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkEgXCIuY29uY2F0KGVsbGlwc2lzU3BlY3NbMF0sIFwiIFwiKS5jb25jYXQoZWxsaXBzaXNTcGVjc1sxXSwgXCIgXCIpLmNvbmNhdChlbGxpcHNpc1NwZWNzWzJdLCBcIiAwIFwiKS5jb25jYXQoc3dlZXBGbGFnLCBcIiBcIikuY29uY2F0KHBvaW50LngsIFwiIFwiKS5jb25jYXQocG9pbnQueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc3ZnUGF0aHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoRW5kID0gYXV0b2Nsb3NlID8gJ3onIDogJyc7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChzdmdQYXRocy5qb2luKCcgJykudHJpbSgpKS5jb25jYXQocGF0aEVuZCk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5leHBvcnQgdmFyIHBhcnNlRHJhd0NvbW1hbmRzID0gZnVuY3Rpb24gKGNvbW1hbmRzKSB7XG4gICAgdmFyIGNvbW1hbmRzQXJyYXkgPSBbXTtcbiAgICB2YXIgYXJyYXk7XG4gICAgd2hpbGUgKChhcnJheSA9IENPTU1BTkRTX1JFR0VYUC5leGVjKGNvbW1hbmRzKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNvbW1hbmQgPSBhcnJheVs1XSB8fCBhcnJheVsxXTtcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjb21tYW5kc0FycmF5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6ICthcnJheVsyXSwgbDogK2FycmF5WzNdLCB0OiArYXJyYXlbNF0gfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgY29tbWFuZHNBcnJheS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5saW5lLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiArYXJyYXlbMl0sIGw6ICthcnJheVszXSwgdDogK2FycmF5WzRdIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzQXJyYXkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHsgcjogK2FycmF5WzZdLCBsOiArYXJyYXlbN10sIHQ6ICthcnJheVs4XSB9LFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiArYXJyYXlbOV0sIGw6ICthcnJheVsxMF0sIHQ6ICthcnJheVsxMV0gfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kc0FycmF5O1xufTtcbmV4cG9ydCB2YXIgdHJhbnNsYXRlQ29tbWFuZFBvaW50cyA9IGZ1bmN0aW9uIChjb21tYW5kcywgcmlnaHQsIGxlZnQsIHRvcCkge1xuICAgIGNvbW1hbmRzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1hbmQpIHtcbiAgICAgICAgY29tbWFuZC5wb2ludC5yICs9IHJpZ2h0O1xuICAgICAgICBjb21tYW5kLnBvaW50LmwgKz0gbGVmdDtcbiAgICAgICAgY29tbWFuZC5wb2ludC50ICs9IHRvcDtcbiAgICAgICAgaWYgKGNvbW1hbmQuY29udHJvbCkge1xuICAgICAgICAgICAgY29tbWFuZC5jb250cm9sLnIgKz0gcmlnaHQ7XG4gICAgICAgICAgICBjb21tYW5kLmNvbnRyb2wubCArPSBsZWZ0O1xuICAgICAgICAgICAgY29tbWFuZC5jb250cm9sLnQgKz0gdG9wO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuZXhwb3J0IHZhciBnZXRUZXh0dXJlQ29ybmVyID0gZnVuY3Rpb24gKGNvbW1hbmRzLCBjZW50ZXJYLCBjZW50ZXJZLCBzY2FsZSkge1xuICAgIHZhciBjb3JuZXIgPSB7XG4gICAgICAgIHg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICB5OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIH07XG4gICAgZ2V0Q29tbWFuZHNXaXRoU3RhcnQoY29tbWFuZHMpXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGMucG9pbnQsIHNjYWxlKTtcbiAgICAgICAgaWYgKHBvaW50LnggPCBjb3JuZXIueCB8fFxuICAgICAgICAgICAgKHBvaW50LnggPT09IGNvcm5lci54ICYmXG4gICAgICAgICAgICAgICAgcG9pbnQueSA8IGNvcm5lci55KSkge1xuICAgICAgICAgICAgY29ybmVyLnggPSBwb2ludC54O1xuICAgICAgICAgICAgY29ybmVyLnkgPSBwb2ludC55O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvcm5lcjtcbn07XG5leHBvcnQgdmFyIGlzU1ZHUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAnZmlsbENvbG9yJyxcbiAgICAgICAgJ2ZpbGxPcGFjaXR5JyxcbiAgICAgICAgJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgJ3N0cm9rZU9wYWNpdHknLFxuICAgICAgICAnc3Ryb2tlV2lkdGgnXG4gICAgXS5pbmNsdWRlcyhwcm9wZXJ0eSk7XG59O1xuZXhwb3J0IHZhciBnZXRTVkdQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGxDb2xvcjogJ2ZpbGwnLFxuICAgICAgICBmaWxsT3BhY2l0eTogJ2ZpbGwtb3BhY2l0eScsXG4gICAgICAgIHN0cm9rZUNvbG9yOiAnc3Ryb2tlJyxcbiAgICAgICAgc3Ryb2tlT3BhY2l0eTogJ3N0cm9rZS1vcGFjaXR5JyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6ICdzdHJva2Utd2lkdGgnXG4gICAgfVtwcm9wZXJ0eV07XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJUb0VsZW1lbnQoZWxlbWVudCwgbGlzdGVuZXJzLCBldmVudCwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB7XG4gICAgICAgIGZuOiBjYWxsYmFjayxcbiAgICAgICAgZm5CaW5kOiBjYWxsYmFjay5iaW5kKHRoaXMpXG4gICAgfTtcbiAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lci5mbkJpbmQsIHVzZUNhcHR1cmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tRWxlbWVudChlbGVtZW50LCBsaXN0ZW5lcnMsIGV2ZW50LCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBsaXN0ZW5lcjtcbiAgICBsaXN0ZW5lcnMuZmluZChmdW5jdGlvbiAobG4sIGluZGV4KSB7XG4gICAgICAgIGlmIChsbi5mbiA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLmZuQmluZCwgdXNlQ2FwdHVyZSk7XG4gICAgfVxufVxuZXhwb3J0IHZhciBnZXRQYXR0ZXJuVHJhbnNmb3JtID0gZnVuY3Rpb24gKGNvcm5lciwgcGxhbmVWaWV3LCBzY2FsZSwgcm90YXRpb24pIHtcbiAgICB2YXIgbWF0cml4ID0gZ2V0Vmlld01hdHJpeChwbGFuZVZpZXcsIHJvdGF0aW9uKTtcbiAgICB2YXIgdHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGNvcm5lci54LCBcIiBcIikuY29uY2F0KGNvcm5lci55LCBcIilcIik7XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgICB2YXIgbTEgPSByb3VuZChtYXRyaXhbMF1bMF0sIERFQ0lNQUxTKTtcbiAgICAgICAgdmFyIG0yID0gcm91bmQobWF0cml4WzFdWzBdLCBERUNJTUFMUyk7XG4gICAgICAgIHZhciBtMyA9IHJvdW5kKG1hdHJpeFswXVsxXSwgREVDSU1BTFMpO1xuICAgICAgICB2YXIgbTQgPSByb3VuZChtYXRyaXhbMV1bMV0sIERFQ0lNQUxTKTtcbiAgICAgICAgdHJhbnNmb3JtICs9IFwiIG1hdHJpeChcIi5jb25jYXQobTEsIFwiLFwiKS5jb25jYXQobTIsIFwiLFwiKS5jb25jYXQobTMsIFwiLFwiKS5jb25jYXQobTQsIFwiLDAsMClcIik7XG4gICAgICAgIHRyYW5zZm9ybSArPSBcIiBzY2FsZShcIi5jb25jYXQocm91bmQoU0NBTEUgKiAoc2NhbGUgfHwgMSksIERFQ0lNQUxTKSwgXCIpXCIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2FsZSkge1xuICAgICAgICB0cmFuc2Zvcm0gKz0gXCIgc2NhbGUoXCIuY29uY2F0KHJvdW5kKHNjYWxlLCBERUNJTUFMUyksIFwiKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybTtcbn07XG5leHBvcnQgdmFyIGVsZW1lbnRIYXNTVkdQYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnU1ZHU1ZHRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50SGFzU1ZHUGFyZW50KGVsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgdmFyIGdldEFuaW1hdGlvblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZ2V0UGF0aCwgYW5pbWF0aW9uLCBwcm9wcykge1xuICAgIHZhciBwcm9wZXJ0aWVzO1xuICAgIHZhciBsb2NhbEdldFBhdGggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wcyksIChfYSA9IHt9LCBfYVthbmltYXRpb24ucHJvcGVydHldID0gK3ZhbHVlLCBfYSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0UGF0aCh2YWx1ZSk7XG4gICAgfTtcbiAgICBpZiAoYW5pbWF0aW9uLnZhbHVlcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbmltYXRpb24udmFsdWVzKSkge1xuICAgICAgICAgICAgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGFuaW1hdGlvbi52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHZXRQYXRoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCc7JylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlczogbG9jYWxHZXRQYXRoKGFuaW1hdGlvbi52YWx1ZXMpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgZnJvbTogbG9jYWxHZXRQYXRoKGFuaW1hdGlvbi5mcm9tKSxcbiAgICAgICAgICAgIHRvOiBsb2NhbEdldFBhdGgoYW5pbWF0aW9uLnRvKVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydGllcztcbn07XG4iLCJ2YXIgU3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0b3JlKHdpZHRoLCBoZWlnaHQsIHNjYWxlKSB7XG4gICAgICAgIHRoaXMuc2l6ZXMgPSB7XG4gICAgICAgICAgICBjZW50ZXJYOiB3aWR0aCAvIDIsXG4gICAgICAgICAgICBjZW50ZXJZOiBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBzY2FsZTogc2NhbGVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0b3JlLnByb3RvdHlwZSwgXCJ3aWR0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZXMud2lkdGg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNpemVzLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNpemVzLmNlbnRlclggPSB2YWx1ZSAvIDI7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RvcmUucHJvdG90eXBlLCBcImhlaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZXMuaGVpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zaXplcy5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZXMuY2VudGVyWSA9IHZhbHVlIC8gMjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdG9yZS5wcm90b3R5cGUsIFwic2NhbGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpemVzLnNjYWxlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zaXplcy5zY2FsZSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0b3JlLnByb3RvdHlwZSwgXCJjZW50ZXJYXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaXplcy5jZW50ZXJYO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0b3JlLnByb3RvdHlwZSwgXCJjZW50ZXJZXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaXplcy5jZW50ZXJZO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIFN0b3JlO1xufSgpKTtcbmV4cG9ydCB7IFN0b3JlIH07XG4iLCJ2YXIgSXNvbWV0cmljU3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1N0b3JlKCkge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljU3RvcmUucHJvdG90eXBlLCBcImRhdGFcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTdG9yZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVN0b3JlID0gc3RvcmU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gSXNvbWV0cmljU3RvcmU7XG59KCkpO1xuZXhwb3J0IHsgSXNvbWV0cmljU3RvcmUgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY1N0b3JlIH0gZnJvbSAnLi9Jc29tZXRyaWNTdG9yZSc7XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuaW1wb3J0IHsgU1ZHX05BTUVTUEFDRSB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgSXNvbWV0cmljU3RvcmUgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTdG9yZSc7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBhZGRFdmVudExpc3RlbmVyVG9FbGVtZW50LCByZW1vdmVFdmVudExpc3RlbmVyRnJvbUVsZW1lbnQgfSBmcm9tICdAdXRpbHMvc3ZnJztcbnZhciBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljRWxlbWVudEFic3RyYWN0KGlkLCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9pZCA9IGlkO1xuICAgICAgICBfdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgX3RoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBzdmdFbGVtZW50KTtcbiAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhfdGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAnaWQnOiBfdGhpcy5faWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljRWxlbWVudEFic3RyYWN0LnByb3RvdHlwZS5zZXRJZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwge1xuICAgICAgICAgICAgJ2lkJzogdGhpcy5faWRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gICAgfTtcbiAgICBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgIGlmICh1c2VDYXB0dXJlID09PSB2b2lkIDApIHsgdXNlQ2FwdHVyZSA9IGZhbHNlOyB9XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXJUb0VsZW1lbnQuY2FsbCh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMubGlzdGVuZXJzLCBldmVudCwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICAgICAgaWYgKHVzZUNhcHR1cmUgPT09IHZvaWQgMCkgeyB1c2VDYXB0dXJlID0gZmFsc2U7IH1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21FbGVtZW50KHRoaXMuZWxlbWVudCwgdGhpcy5saXN0ZW5lcnMsIGV2ZW50LCBjYWxsYmFjaywgdXNlQ2FwdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdDtcbn0oSXNvbWV0cmljU3RvcmUpKTtcbmV4cG9ydCB7IElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdCB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljRWxlbWVudEFic3RyYWN0IH0gZnJvbSAnLi9Jc29tZXRyaWNFbGVtZW50QWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBDb2xvcnMsIExpbmVDYXAsIExpbmVKb2luLCBERUNJTUFMUywgU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBnZXRTVkdQcm9wZXJ0eSwgZ2V0UGF0dGVyblRyYW5zZm9ybSwgaXNTVkdQcm9wZXJ0eSwgZ2V0QW5pbWF0aW9uUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgdXVpZCwgcm91bmQsIGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50IH0gZnJvbSAnQHV0aWxzL21hdGgnO1xuaW1wb3J0IHsgSXNvbWV0cmljRWxlbWVudEFic3RyYWN0IH0gZnJvbSAnLi4vSXNvbWV0cmljRWxlbWVudEFic3RyYWN0JztcbnZhciBkZWZhdWx0T2JqZWN0UHJvcHMgPSB7XG4gICAgZmlsbENvbG9yOiBDb2xvcnMud2hpdGUsXG4gICAgZmlsbE9wYWNpdHk6IDEsXG4gICAgc3Ryb2tlQ29sb3I6IENvbG9ycy5ibGFjayxcbiAgICBzdHJva2VEYXNoQXJyYXk6IFtdLFxuICAgIHN0cm9rZUxpbmVjYXA6IExpbmVDYXAuYnV0dCxcbiAgICBzdHJva2VMaW5lam9pbjogTGluZUpvaW4ucm91bmQsXG4gICAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgICBzdHJva2VXaWR0aDogMVxufTtcbnZhciBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0KHByb3BzLCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLmlkIHx8IHV1aWQoKSwgc3ZnRWxlbWVudCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdE9iamVjdFByb3BzKSwgcHJvcHMpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25zID0gW107XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICBfdGhpcy5jcmVhdGVUZXh0dXJlKF90aGlzLnByb3BzLnRleHR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoX3RoaXMuZWxlbWVudCwgX19hc3NpZ24oeyAnZmlsbCc6IF90aGlzLnByb3BzLnRleHR1cmVcbiAgICAgICAgICAgICAgICA/IFwidXJsKCNcIi5jb25jYXQoX3RoaXMucGF0dGVybklkLCBcIikgXCIpLmNvbmNhdChfdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgOiBfdGhpcy5maWxsQ29sb3IsICdmaWxsLW9wYWNpdHknOiBcIlwiLmNvbmNhdChfdGhpcy5maWxsT3BhY2l0eSksICdzdHJva2UnOiBfdGhpcy5zdHJva2VDb2xvciwgJ3N0cm9rZS1kYXNoYXJyYXknOiBfdGhpcy5zdHJva2VEYXNoQXJyYXkuam9pbignICcpLCAnc3Ryb2tlLWxpbmVjYXAnOiBfdGhpcy5zdHJva2VMaW5lY2FwLCAnc3Ryb2tlLWxpbmVqb2luJzogX3RoaXMuc3Ryb2tlTGluZWpvaW4sICdzdHJva2Utb3BhY2l0eSc6IFwiXCIuY29uY2F0KF90aGlzLnN0cm9rZU9wYWNpdHkpLCAnc3Ryb2tlLXdpZHRoJzogXCJcIi5jb25jYXQoX3RoaXMuc3Ryb2tlV2lkdGgpIH0sIChfdGhpcy5wcm9wcy5jbGFzc05hbWUgJiYge1xuICAgICAgICAgICAgY2xhc3M6IF90aGlzLnByb3BzLmNsYXNzTmFtZVxuICAgICAgICB9KSkpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUuY3JlYXRlVGV4dHVyZSA9IGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMucGF0dGVybklkID0gXCJcIi5jb25jYXQodGhpcy5pZCwgXCJfX3RleHR1cmVcIik7XG4gICAgICAgIHRoaXMucGF0dGVybiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMucGF0dGVybik7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5wYXR0ZXJuLCB7XG4gICAgICAgICAgICAnaWQnOiB0aGlzLnBhdHRlcm5JZCxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJzogJ25vbmUnLFxuICAgICAgICAgICAgJ3BhdHRlcm5Vbml0cyc6ICd1c2VyU3BhY2VPblVzZSdcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMuaW1hZ2UpO1xuICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKGltYWdlLCB7XG4gICAgICAgICAgICAnaHJlZic6IHRleHR1cmUudXJsLFxuICAgICAgICAgICAgJ3gnOiAnMCcsXG4gICAgICAgICAgICAneSc6ICcwJyxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJzogJ25vbmUnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGV4dHVyZS5waXhlbGF0ZWQpIHtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoaW1hZ2UsIHtcbiAgICAgICAgICAgICAgICAnc3R5bGUnOiAnaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdHRlcm4uYXBwZW5kQ2hpbGQoaW1hZ2UpO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS5fdXBkYXRlVGV4dHVyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGltYWdlID0gdGhpcy5wYXR0ZXJuLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnRleHR1cmUudXJsICYmXG4gICAgICAgICAgICBpbWFnZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSAhPT0gdGhpcy5wcm9wcy50ZXh0dXJlLnVybCkge1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhpbWFnZSwge1xuICAgICAgICAgICAgICAgICdocmVmJzogdGhpcy5wcm9wcy50ZXh0dXJlLnVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMudGV4dHVyZS5waXhlbGF0ZWQpIHtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoaW1hZ2UsIHtcbiAgICAgICAgICAgICAgICAnc3R5bGUnOiAnaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS5hZGRBbmltYXRpb25CYXNpY1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSwgYW5pbWF0aW9uKSB7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHtcbiAgICAgICAgICAgIHJlcGVhdENvdW50OiBcIlwiLmNvbmNhdChhbmltYXRpb24ucmVwZWF0IHx8ICdpbmRlZmluaXRlJyksXG4gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgZHVyOiBcIlwiLmNvbmNhdChhbmltYXRpb24uZHVyYXRpb24gfHwgMSwgXCJzXCIpXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS51cGRhdGVBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChpc05hdGl2ZVNWR1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gZ2V0U1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUy5hbmltYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5pbWF0aW9uLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5hZGRBbmltYXRpb25CYXNpY1Byb3BlcnRpZXMocHJvcGVydHksIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBnZXRBbmltYXRpb25Qcm9wZXJ0aWVzKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gXCJcIi5jb25jYXQodmFsdWUpOyB9LCBhbmltYXRpb24pO1xuICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVTdWJDbGFzc0FuaW1hdGlvbnMoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUudXBkYXRlUGF0dGVyblRyYW5zZm9ybSA9IGZ1bmN0aW9uIChjb3JuZXIsIHBsYW5lVmlldykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudGV4dHVyZSkge1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMucHJvcHMudGV4dHVyZS5oZWlnaHRcbiAgICAgICAgICAgICAgICA/IFwiXCIuY29uY2F0KHRoaXMucHJvcHMudGV4dHVyZS5oZWlnaHQgKiB0aGlzLmRhdGEuc2NhbGUpXG4gICAgICAgICAgICAgICAgOiAnMTAwJSc7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLnByb3BzLnRleHR1cmUud2lkdGhcbiAgICAgICAgICAgICAgICA/IFwiXCIuY29uY2F0KHRoaXMucHJvcHMudGV4dHVyZS53aWR0aCAqIHRoaXMuZGF0YS5zY2FsZSlcbiAgICAgICAgICAgICAgICA6ICcxMDAlJztcbiAgICAgICAgICAgIHZhciBzaGlmdCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KDAsIDAsIHtcbiAgICAgICAgICAgICAgICByOiAoKF9hID0gdGhpcy5wcm9wcy50ZXh0dXJlLnNoaWZ0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmlnaHQpIHx8IDAsXG4gICAgICAgICAgICAgICAgbDogKChfYiA9IHRoaXMucHJvcHMudGV4dHVyZS5zaGlmdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmxlZnQpIHx8IDAsXG4gICAgICAgICAgICAgICAgdDogKChfYyA9IHRoaXMucHJvcHMudGV4dHVyZS5zaGlmdCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvcCkgfHwgMFxuICAgICAgICAgICAgfSwgdGhpcy5kYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm0gPSBnZXRQYXR0ZXJuVHJhbnNmb3JtKHtcbiAgICAgICAgICAgICAgICB4OiByb3VuZChjb3JuZXIueCArIHNoaWZ0LngsIERFQ0lNQUxTKSxcbiAgICAgICAgICAgICAgICB5OiByb3VuZChjb3JuZXIueSArIHNoaWZ0LnksIERFQ0lNQUxTKVxuICAgICAgICAgICAgfSwgdGhpcy5wcm9wcy50ZXh0dXJlLnBsYW5lVmlldyB8fCBwbGFuZVZpZXcsIHRoaXMucHJvcHMudGV4dHVyZS5zY2FsZSwgdGhpcy5wcm9wcy50ZXh0dXJlLnJvdGF0aW9uKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5wYXR0ZXJuLCB7XG4gICAgICAgICAgICAgICAgJ3BhdHRlcm5UcmFuc2Zvcm0nOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiB3aWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMucGF0dGVybi5maXJzdENoaWxkLCB7XG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiB3aWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLCBcImlkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldElkKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5JZCA9IFwiXCIuY29uY2F0KHRoaXMuaWQsIFwiX190ZXh0dXJlXCIpO1xuICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5wYXR0ZXJuLCB7XG4gICAgICAgICAgICAgICAgICAgICdpZCc6IHRoaXMucGF0dGVybklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJmaWxsQ29sb3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLmZpbGxDb2xvcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuZmlsbENvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwge1xuICAgICAgICAgICAgICAgICdmaWxsJzogdGhpcy5wcm9wcy50ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgID8gXCJ1cmwoI1wiLmNvbmNhdCh0aGlzLnBhdHRlcm5JZCwgXCIpIFwiKS5jb25jYXQodGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5maWxsQ29sb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwiZmlsbE9wYWNpdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLmZpbGxPcGFjaXR5O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5maWxsT3BhY2l0eSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ2ZpbGwtb3BhY2l0eSc6IFwiXCIuY29uY2F0KHRoaXMuZmlsbE9wYWNpdHkpIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwidGV4dHVyZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudGV4dHVyZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBoYXNUZXh0dXJlID0gISF0aGlzLnByb3BzLnRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHR1cmUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChoYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUZXh0dXJlKHRoaXMucHJvcHMudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLCBcInN0cm9rZUNvbG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VDb2xvcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc3Ryb2tlQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7ICdzdHJva2UnOiB0aGlzLnN0cm9rZUNvbG9yIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwic3Ryb2tlRGFzaEFycmF5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VEYXNoQXJyYXk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnN0cm9rZURhc2hBcnJheSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ3N0cm9rZS1kYXNoYXJyYXknOiB0aGlzLnN0cm9rZURhc2hBcnJheS5qb2luKCcgJykgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJzdHJva2VMaW5lY2FwXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VMaW5lY2FwO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VMaW5lY2FwID0gTGluZUNhcFt2YWx1ZV07XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwgeyAnc3Ryb2tlLWxpbmVjYXAnOiB0aGlzLnN0cm9rZUxpbmVjYXAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJzdHJva2VMaW5lam9pblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc3Ryb2tlTGluZWpvaW47XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnN0cm9rZUxpbmVqb2luID0gTGluZUpvaW5bdmFsdWVdO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ3N0cm9rZS1saW5lam9pbic6IHRoaXMuc3Ryb2tlTGluZWpvaW4gfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJzdHJva2VPcGFjaXR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VPcGFjaXR5O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VPcGFjaXR5ID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwgeyAnc3Ryb2tlLW9wYWNpdHknOiBcIlwiLmNvbmNhdCh0aGlzLnN0cm9rZU9wYWNpdHkpIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwic3Ryb2tlV2lkdGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLnN0cm9rZVdpZHRoO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VXaWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ3N0cm9rZS13aWR0aCc6IFwiXCIuY29uY2F0KHRoaXMuc3Ryb2tlV2lkdGgpIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwiY2xhc3NOYW1lXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jbGFzc05hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmNsYXNzTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAnY2xhc3MnOiB0aGlzLnByb3BzLmNsYXNzTmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLmdldFBhdHRlcm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm47XG4gICAgfTtcbiAgICBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLnVwZGF0ZVRleHR1cmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGhhc1RleHR1cmUgPSAhIXRoaXMucHJvcHMudGV4dHVyZTtcbiAgICAgICAgaWYgKGhhc1RleHR1cmUgfHwgdmFsdWUudXJsKSB7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSB2YWx1ZS5zaGlmdCwgcm90YXRpb24gPSB2YWx1ZS5yb3RhdGlvbiwgbmV3UHJvcHMgPSBfX3Jlc3QodmFsdWUsIFtcInNoaWZ0XCIsIFwicm90YXRpb25cIl0pO1xuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0dXJlID0gaGFzVGV4dHVyZVxuICAgICAgICAgICAgICAgID8gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMucHJvcHMudGV4dHVyZSksIG5ld1Byb3BzKSA6IF9fYXNzaWduKHt9LCBuZXdQcm9wcyk7XG4gICAgICAgICAgICBpZiAoc2hpZnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHR1cmUuc2hpZnQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgKHRoaXMucHJvcHMudGV4dHVyZS5zaGlmdCB8fCB7fSkpLCBzaGlmdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHR1cmUucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUZXh0dXJlKHRoaXMucHJvcHMudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUuYWRkQW5pbWF0aW9uID0gZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMucHVzaChfX2Fzc2lnbih7fSwgYW5pbWF0aW9uKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS5yZW1vdmVBbmltYXRpb25CeUluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5hbmltYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5lbGVtZW50ICYmIGFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUucmVtb3ZlQW5pbWF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFuaW1hdGlvbnMgPSB0aGlzLmFuaW1hdGlvbnMuc3BsaWNlKDApO1xuICAgICAgICBhbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5lbGVtZW50ICYmIGFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdDtcbn0oSXNvbWV0cmljRWxlbWVudEFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdCB9IGZyb20gJy4vSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0JztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5pbXBvcnQgeyBlbGVtZW50SGFzU1ZHUGFyZW50IH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG5pbXBvcnQgeyBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNFbGVtZW50QWJzdHJhY3QnO1xuaW1wb3J0IHsgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0JztcbnZhciBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0KGlkLCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGlkLCBzdmdFbGVtZW50KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuZ2V0Q2hpbGRJbmRleCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUudGhyb3dDaGlsZEVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgcHJvdmlkZSBhIGNoaWxkIHRoYXQgaXMgbm90IGEgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lcicpO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZVNWR0NoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBzdmdDaGlsZCA9IGNoaWxkLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0KSB7XG4gICAgICAgICAgICB2YXIgc3ZnUGF0dGVybkNoaWxkID0gY2hpbGQuZ2V0UGF0dGVybigpO1xuICAgICAgICAgICAgaWYgKHN2Z1BhdHRlcm5DaGlsZCAmJiBzdmdQYXR0ZXJuQ2hpbGQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChzdmdQYXR0ZXJuQ2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdmdDaGlsZC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQoc3ZnQ2hpbGQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuaW5zZXJ0UGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHBhdHRlcm4sIHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZSwgXCJpZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJZCh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLCBcImNoaWxkcmVuXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZWxlbWVudEhhc1NWR1BhcmVudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkLmRhdGEgPSBfdGhpcy5kYXRhO1xuICAgICAgICAgICAgICAgIGNoaWxkLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuLnNwbGljZSgwKTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIF90aGlzLnJlbW92ZVNWR0NoaWxkKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkLmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0UGF0dGVybihjaGlsZC5nZXRQYXR0ZXJuKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZC5nZXRFbGVtZW50KCkpO1xuICAgICAgICBjaGlsZC51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuYWRkQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgY2hpbGRyZW5bX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gX3RoaXMuYWRkQ2hpbGQoY2hpbGQpOyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuZ2V0Q2hpbGRCeUluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbltpbmRleF0gfHwgbnVsbDtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5nZXRDaGlsZEJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5fY2hpbGRyZW4uZmluZChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLmlkID09PSBpZDsgfSk7XG4gICAgICAgIHJldHVybiBjaGlsZCB8fCBudWxsO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBjaGlsZEluZGV4ID0gdGhpcy5nZXRDaGlsZEluZGV4KGNoaWxkKTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTVkdDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRocm93Q2hpbGRFcnJvcigpO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGNoaWxkcmVuW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gX3RoaXMuZ2V0Q2hpbGRJbmRleChjaGlsZCk7XG4gICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkQnlJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5fY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU1ZHQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkQnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChpZCk7XG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuc2V0Q2hpbGRJbmRleCA9IGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNoaWxkSW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBpbmRleCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGluZGV4KSwgdGhpcy5fY2hpbGRyZW4ubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB2YXIgbW92ZWRFbGVtZW50ID0gY2hpbGQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgdmFyIHJlcGxhY2VkRWxlbWVudCA9IHRoaXMuX2NoaWxkcmVuW2luZGV4XS5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW5baW5kZXhdICE9PSBjaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnNwbGljZShjaGlsZEluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUobW92ZWRFbGVtZW50LCByZXBsYWNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkRWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShtb3ZlZEVsZW1lbnQsIHJlcGxhY2VkRWxlbWVudC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQobW92ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyb3dDaGlsZEVycm9yKCk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuYnJpbmdDaGlsZFRvRnJvbnQgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkSW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNldENoaWxkSW5kZXgoY2hpbGQsIHRoaXMuX2NoaWxkcmVuLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5icmluZ0NoaWxkRm9yd2FyZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRoaXMuZ2V0Q2hpbGRJbmRleChjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZEluZGV4IDwgdGhpcy5fY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hpbGRJbmRleChjaGlsZCwgY2hpbGRJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5zZW5kQ2hpbGRUb0JhY2sgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkSW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNldENoaWxkSW5kZXgoY2hpbGQsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5zZW5kQ2hpbGRCYWNrd2FyZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRoaXMuZ2V0Q2hpbGRJbmRleChjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hpbGRJbmRleChjaGlsZCwgY2hpbGRJbmRleCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdDtcbn0oSXNvbWV0cmljRWxlbWVudEFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QgfSBmcm9tICcuL0lzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0JztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuaW1wb3J0IHsgU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLCBTVkdfUFJPUEVSVElFUywgREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQsIENvbG9ycyB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkU1ZHUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJ0B1dGlscy9tYXRoJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQHN0b3JlJztcbmltcG9ydCB7IElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QnO1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjb250YWluZXI6ICdib2R5JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IENvbG9ycy53aGl0ZSxcbiAgICBzY2FsZTogMSxcbiAgICBoZWlnaHQ6IERFRkFVTFRfSEVJR0hULFxuICAgIHdpZHRoOiBERUZBVUxUX1dJRFRIXG59O1xudmFyIElzb21ldHJpY0NhbnZhcyA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY0NhbnZhcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNDYW52YXMocHJvcHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocHJvcHMgPT09IHZvaWQgMCkgeyBwcm9wcyA9IHt9OyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLmlkIHx8IHV1aWQoKSwgU1ZHX0VMRU1FTlRTLnN2ZykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdFByb3BzKSwgcHJvcHMpO1xuICAgICAgICBfdGhpcy5pc0FuaW1hdGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGF0YSA9IG5ldyBTdG9yZShfdGhpcy5wcm9wcy53aWR0aCwgX3RoaXMucHJvcHMuaGVpZ2h0LCBfdGhpcy5wcm9wcy5zY2FsZSk7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoX3RoaXMuZWxlbWVudCwgKF9hID0ge30sXG4gICAgICAgICAgICBfYVtTVkdfUFJPUEVSVElFUy52aWV3Qm94XSA9IFwiMCAwIFwiLmNvbmNhdChfdGhpcy5kYXRhLndpZHRoLCBcIiBcIikuY29uY2F0KF90aGlzLmRhdGEuaGVpZ2h0KSxcbiAgICAgICAgICAgIF9hLndpZHRoID0gXCJcIi5jb25jYXQoX3RoaXMuZGF0YS53aWR0aCwgXCJweFwiKSxcbiAgICAgICAgICAgIF9hLmhlaWdodCA9IFwiXCIuY29uY2F0KF90aGlzLmRhdGEuaGVpZ2h0LCBcInB4XCIpLFxuICAgICAgICAgICAgX2EpKTtcbiAgICAgICAgX3RoaXMuYmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMucmVjdCk7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoX3RoaXMuYmFja2dyb3VuZCwge1xuICAgICAgICAgICAgZmlsbDogX3RoaXMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgeDogJzAnLFxuICAgICAgICAgICAgeTogJzAnLFxuICAgICAgICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KF90aGlzLmRhdGEud2lkdGgsIFwicHhcIiksXG4gICAgICAgICAgICBoZWlnaHQ6IFwiXCIuY29uY2F0KF90aGlzLmRhdGEuaGVpZ2h0LCBcInB4XCIpXG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKF90aGlzLmJhY2tncm91bmQpO1xuICAgICAgICB2YXIgY29udGFpbmVyRWxlbWVudCA9IHR5cGVvZiBfdGhpcy5wcm9wcy5jb250YWluZXIgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoX3RoaXMucHJvcHMuY29udGFpbmVyKVxuICAgICAgICAgICAgOiBfdGhpcy5wcm9wcy5jb250YWluZXI7XG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoX3RoaXMuZWxlbWVudCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0NhbnZhcy5wcm90b3R5cGUsIFwiYmFja2dyb3VuZENvbG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmJhY2tncm91bmRDb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmJhY2tncm91bmQsIHsgZmlsbDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZSwgXCJzY2FsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zY2FsZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zY2FsZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNDYW52YXMucHJvdG90eXBlLCBcImhlaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oZWlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICB0aGlzLmRhdGEuaGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwgKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbU1ZHX1BST1BFUlRJRVMudmlld0JveF0gPSBcIjAgMCBcIi5jb25jYXQodGhpcy5kYXRhLndpZHRoLCBcIiBcIikuY29uY2F0KHRoaXMuZGF0YS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIF9hLmhlaWdodCA9IFwiXCIuY29uY2F0KHRoaXMuZGF0YS5oZWlnaHQsIFwicHhcIiksXG4gICAgICAgICAgICAgICAgX2EpKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5iYWNrZ3JvdW5kLCB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBcIlwiLmNvbmNhdCh0aGlzLmRhdGEuaGVpZ2h0LCBcInB4XCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZSwgXCJ3aWR0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS53aWR0aDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS53aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIChfYSA9IHt9LFxuICAgICAgICAgICAgICAgIF9hW1NWR19QUk9QRVJUSUVTLnZpZXdCb3hdID0gXCIwIDAgXCIuY29uY2F0KHRoaXMuZGF0YS53aWR0aCwgXCIgXCIpLmNvbmNhdCh0aGlzLmRhdGEuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBfYS53aWR0aCA9IFwiXCIuY29uY2F0KHRoaXMuZGF0YS53aWR0aCwgXCJweFwiKSxcbiAgICAgICAgICAgICAgICBfYSkpO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmJhY2tncm91bmQsIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogXCJcIi5jb25jYXQodGhpcy5kYXRhLndpZHRoLCBcInB4XCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZSwgXCJhbmltYXRlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNBbmltYXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIElzb21ldHJpY0NhbnZhcy5wcm90b3R5cGUuZ2V0U1ZHQ29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vdXRlckhUTUw7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDYW52YXMucHJvdG90eXBlLnBhdXNlQW5pbWF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN2ZyA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBzdmcucGF1c2VBbmltYXRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdmcucGF1c2VBbmltYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZS5yZXN1bWVBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3ZnID0gdGhpcy5lbGVtZW50O1xuICAgICAgICBpZiAodHlwZW9mIHN2Zy51bnBhdXNlQW5pbWF0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3ZnLnVucGF1c2VBbmltYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FuaW1hdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gSXNvbWV0cmljQ2FudmFzO1xufShJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCkpO1xuZXhwb3J0IHsgSXNvbWV0cmljQ2FudmFzIH07XG4iLCJleHBvcnQgKiBmcm9tICcuL0lzb21ldHJpY0NhbnZhcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiIsImV4cG9ydCB2YXIgYXBwbHlNaXhpbnMgPSBmdW5jdGlvbiAoQmFzZUNsYXNzLCBjb25zdHJ1Y3Rvcikge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvbnN0cnVjdG9yLnByb3RvdHlwZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmFzZUNsYXNzLnByb3RvdHlwZSwgbmFtZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIG5hbWUpKTtcbiAgICB9KTtcbn07XG4iLCJleHBvcnQgdmFyIE5PX0xJTUlUUyA9IFtcbiAgICBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuXTtcbmV4cG9ydCB2YXIgRFJBR19FVkVOVDtcbihmdW5jdGlvbiAoRFJBR19FVkVOVCkge1xuICAgIERSQUdfRVZFTlRbXCJEUkFHX1NUQVJUXCJdID0gXCJkcmFnc3RhcnRcIjtcbiAgICBEUkFHX0VWRU5UW1wiRFJBR1wiXSA9IFwiZHJhZ1wiO1xuICAgIERSQUdfRVZFTlRbXCJEUkFHX0VORFwiXSA9IFwiZHJhZ2VuZFwiO1xufSkoRFJBR19FVkVOVCB8fCAoRFJBR19FVkVOVCA9IHt9KSk7XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IEVWRU5UUywgREVDSU1BTFMsIFBsYW5lVmlldywgVHlwZW9mIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRUb3BQbGFuZVBvaW50RnJvbUNvb3JkaW5hdGVzLCBnZXRGcm9udFBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMsIGdldFNpZGVQbGFuZVBvaW50RnJvbUNvb3JkaW5hdGVzLCByb3VuZCB9IGZyb20gJ0B1dGlscy9tYXRoJztcbmltcG9ydCB7IElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0VsZW1lbnRBYnN0cmFjdCc7XG5pbXBvcnQgeyBOT19MSU1JVFMsIERSQUdfRVZFTlQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG52YXIgX2lzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFR5cGVvZi5VTkRFRklORUQ7XG52YXIgX3JlcXVlc3RBbmltYXRpb25GcmFtZSA9IF9pc0Jyb3dzZXJcbiAgICA/ICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpXG4gICAgOiBudWxsO1xudmFyIF9kcmFnU3RvcmVEZWZhdWx0ID0ge1xuICAgIHJpZ2h0OiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwLFxuICAgIHg6IDAsXG4gICAgeTogMFxufTtcbnZhciBpc01vdXNlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuICdjbGllbnRYJyBpbiBldmVudDsgfTtcbnZhciBnZXRDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsaWVudFg6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICAgIGNsaWVudFk6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59O1xudmFyIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJ0RHJhZyA9IHRoaXMuc3RhcnREcmFnLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3RvcERyYWcgPSB0aGlzLnN0b3BEcmFnLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubW92ZUVsZW1lbnQgPSB0aGlzLm1vdmVFbGVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZHJvcEVsZW1lbnQgPSB0aGlzLmRyb3BFbGVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYW5pbWF0ZSA9IHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2JvdW5kcyA9PT0gVHlwZW9mLlVOREVGSU5FRCkge1xuICAgICAgICAgICAgdGhpcy5fYm91bmRzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9kcmFnU3RvcmUgPT09IFR5cGVvZi5VTkRFRklORUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYWdTdG9yZSA9IF9kcmFnU3RvcmVEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29vcmRzID09PSBUeXBlb2YuVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29yZHMgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmJldHdlZW5Cb3VuZHMgPSBmdW5jdGlvbiAodmFsdWUsIGJvdW5kcykge1xuICAgICAgICB2YXIgb3JkZXJlZEJvdW5kcyA9IF9fc3ByZWFkQXJyYXkoW10sIGJvdW5kcywgdHJ1ZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gcm91bmQoTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIG9yZGVyZWRCb3VuZHNbMF0pLCBvcmRlcmVkQm91bmRzWzFdKSwgREVDSU1BTFMpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmdldEJvdW5kT3JNYXhpbXVtID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmJvdW5kc1twcm9wXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogX19zcHJlYWRBcnJheShbXSwgTk9fTElNSVRTLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheShbXSwgTk9fTElNSVRTLCB0cnVlKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5nZXRCb3VuZE9yTWF4aW11bSgncmlnaHQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmV0d2VlbkJvdW5kcyh0aGlzLl9kcmFnU3RvcmUucmlnaHQgKyB2YWx1ZSAvIHRoaXMuZGF0YS5zY2FsZSwgYm91bmRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBib3VuZHMgPSB0aGlzLmdldEJvdW5kT3JNYXhpbXVtKCdsZWZ0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLmJldHdlZW5Cb3VuZHModGhpcy5fZHJhZ1N0b3JlLmxlZnQgKyB2YWx1ZSAvIHRoaXMuZGF0YS5zY2FsZSwgYm91bmRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRPck1heGltdW0oJ3RvcCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5iZXR3ZWVuQm91bmRzKHRoaXMuX2RyYWdTdG9yZS50b3AgKyB2YWx1ZSAvIHRoaXMuZGF0YS5zY2FsZSwgYm91bmRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRGaXhlZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29vcmRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZW50cnkpIHtcbiAgICAgICAgICAgIHZhciBmaXhlZENvb3JkcyA9IF9fYXNzaWduKHt9LCBhY2MpO1xuICAgICAgICAgICAgc3dpdGNoIChlbnRyeVswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgZml4ZWRDb29yZHMucmlnaHQgPSBfdGhpcy5nZXRSaWdodChlbnRyeVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICBmaXhlZENvb3Jkcy5sZWZ0ID0gX3RoaXMuZ2V0TGVmdChlbnRyeVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZpeGVkQ29vcmRzLnRvcCA9IF90aGlzLmdldFRvcChlbnRyeVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZml4ZWRDb29yZHM7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50VHlwZSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIHtcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGV2ZW50VHlwZSA9PT0gRFJBR19FVkVOVC5EUkFHLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgcmlnaHQ6IChfYSA9IHRoaXMuX2Nvb3Jkcy5yaWdodCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5yaWdodCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAoX2IgPSB0aGlzLl9jb29yZHMubGVmdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgIHRvcDogKF9jID0gdGhpcy5fY29vcmRzLnRvcCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdGhpcy50b3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGRyYWdFdmVudCk7XG4gICAgICAgIHJldHVybiBkcmFnRXZlbnQ7XG4gICAgfTtcbiAgICBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2Nvb3Jkcy5yaWdodCA9PT0gVHlwZW9mLk5VTUJFUikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0ID0gdGhpcy5fY29vcmRzLnJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2Nvb3Jkcy5sZWZ0ID09PSBUeXBlb2YuTlVNQkVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IHRoaXMuX2Nvb3Jkcy5sZWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2Nvb3Jkcy50b3AgPT09IFR5cGVvZi5OVU1CRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLl9jb29yZHMudG9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLnN0YXJ0RHJhZyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB2YXIgX2EgPSBnZXRDbGllbnRDb29yZHMoZXZlbnQpLCBjbGllbnRYID0gX2EuY2xpZW50WCwgY2xpZW50WSA9IF9hLmNsaWVudFk7XG4gICAgICAgIHRoaXMuX2RyYWdTdG9yZS54ID0gY2xpZW50WDtcbiAgICAgICAgdGhpcy5fZHJhZ1N0b3JlLnkgPSBjbGllbnRZO1xuICAgICAgICB0aGlzLl9kcmFnU3RvcmUucmlnaHQgPSB0aGlzLnJpZ2h0O1xuICAgICAgICB0aGlzLl9kcmFnU3RvcmUubGVmdCA9IHRoaXMubGVmdDtcbiAgICAgICAgdGhpcy5fZHJhZ1N0b3JlLnRvcCA9IHRoaXMudG9wO1xuICAgICAgICB0aGlzLl91cGRhdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLm1vdmVFbGVtZW50KHsgY2xpZW50WDogY2xpZW50WCwgY2xpZW50WTogY2xpZW50WSB9KTtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRTLlRPVUNIX01PVkUsIHRoaXMubW92ZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVFMuVE9VQ0hfRU5ELCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfTU9WRSwgdGhpcy5tb3ZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRTLk1PVVNFX1VQLCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgX3JlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLm1vdmVFbGVtZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IGdldENsaWVudENvb3JkcyhldmVudCksIGNsaWVudFggPSBfYS5jbGllbnRYLCBjbGllbnRZID0gX2EuY2xpZW50WTtcbiAgICAgICAgdmFyIGRpZmZYID0gY2xpZW50WCAtIHRoaXMuX2RyYWdTdG9yZS54O1xuICAgICAgICB2YXIgZGlmZlkgPSBjbGllbnRZIC0gdGhpcy5fZHJhZ1N0b3JlLnk7XG4gICAgICAgIGlmICh0aGlzLl9kcmFnID09PSBQbGFuZVZpZXcuVE9QKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0aGlzLmdldEZpeGVkQ29vcmRpbmF0ZXMoZ2V0VG9wUGxhbmVQb2ludEZyb21Db29yZGluYXRlcyhkaWZmWCwgZGlmZlkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9kcmFnID09PSBQbGFuZVZpZXcuRlJPTlQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nvb3JkcyA9IHRoaXMuZ2V0Rml4ZWRDb29yZGluYXRlcyhnZXRGcm9udFBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMoZGlmZlgsIGRpZmZZKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0aGlzLmdldEZpeGVkQ29vcmRpbmF0ZXMoZ2V0U2lkZVBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMoZGlmZlgsIGRpZmZZKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRyYWdFdmVudDtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KERSQUdfRVZFTlQuRFJBR19TVEFSVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICBkcmFnRXZlbnQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoRFJBR19FVkVOVC5EUkFHKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2ZW50ZWQgPSAhIShkcmFnRXZlbnQgJiYgZHJhZ0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmRyb3BFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl91cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRTLlRPVUNIX01PVkUsIHRoaXMubW92ZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuVE9VQ0hfRU5ELCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfTU9WRSwgdGhpcy5tb3ZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRTLk1PVVNFX1VQLCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KERSQUdfRVZFTlQuRFJBR19FTkQpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmJlZ2luRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRTLlRPVUNIX1NUQVJULCB0aGlzLnN0YXJ0RHJhZywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5UUy5NT1VTRV9ET1dOLCB0aGlzLnN0YXJ0RHJhZywgdHJ1ZSk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUuc3RvcERyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UUy5UT1VDSF9TVEFSVCwgdGhpcy5zdGFydERyYWcsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuVE9VQ0hfTU9WRSwgdGhpcy5tb3ZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UUy5UT1VDSF9FTkQsIHRoaXMuZHJvcEVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfRE9XTiwgdGhpcy5zdGFydERyYWcsIHRydWUpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UUy5NT1VTRV9NT1ZFLCB0aGlzLm1vdmVFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfVVAsIHRoaXMuZHJvcEVsZW1lbnQsIHRydWUpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZSwgXCJyaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMucmlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5yaWdodCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUsIFwibGVmdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMubGVmdDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmxlZnQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5sZWZ0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUsIFwidG9wXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy50b3A7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy50b3AgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy50b3AgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZSwgXCJkcmFnXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhZyB8fCBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fZHJhZyA9PT0gVHlwZW9mLlVOREVGSU5FRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RyYWcgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChfaXNCcm93c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5EcmFnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLCBcImJvdW5kc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kcyB8fCBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcyA9IHZhbHVlO1xuICAgICAgICAgICAgdmFyIGJvdW5kc1JpZ2h0ID0gdGhpcy5nZXRCb3VuZE9yTWF4aW11bSgncmlnaHQnKTtcbiAgICAgICAgICAgIHZhciBib3VuZHNMZWZ0ID0gdGhpcy5nZXRCb3VuZE9yTWF4aW11bSgnbGVmdCcpO1xuICAgICAgICAgICAgdmFyIGJvdW5kc1RvcCA9IHRoaXMuZ2V0Qm91bmRPck1heGltdW0oJ3RvcCcpO1xuICAgICAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMuYmV0d2VlbkJvdW5kcyh0aGlzLnJpZ2h0LCBib3VuZHNSaWdodCk7XG4gICAgICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmJldHdlZW5Cb3VuZHModGhpcy5sZWZ0LCBib3VuZHNMZWZ0KTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gdGhpcy5iZXR3ZWVuQm91bmRzKHRoaXMudG9wLCBib3VuZHNUb3ApO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0O1xufShJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0IH07XG4iLCJleHBvcnQgeyBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdCB9IGZyb20gJy4vSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgeyBTVkdfRUxFTUVOVFMgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IHV1aWQsIGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50IH0gZnJvbSAnQHV0aWxzL21hdGgnO1xuaW1wb3J0IHsgZWxlbWVudEhhc1NWR1BhcmVudCwgYWRkU1ZHUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMgfSBmcm9tICdAdXRpbHMvb3RoZXInO1xuaW1wb3J0IHsgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCc7XG5pbXBvcnQgeyBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0JztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG59O1xudmFyIElzb21ldHJpY0dyb3VwID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljR3JvdXAocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzID09PSB2b2lkIDApIHsgcHJvcHMgPSB7fTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcy5pZCB8fCB1dWlkKCksIFNWR19FTEVNRU5UUy5ncm91cCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdFByb3BzKSwgcHJvcHMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY0dyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChlbGVtZW50SGFzU1ZHUGFyZW50KHRoaXMuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KDAsIDAsIHtcbiAgICAgICAgICAgICAgICByOiB0aGlzLnByb3BzLnJpZ2h0LFxuICAgICAgICAgICAgICAgIGw6IHRoaXMucHJvcHMubGVmdCxcbiAgICAgICAgICAgICAgICB0OiB0aGlzLnByb3BzLnRvcFxuICAgICAgICAgICAgfSwgdGhpcy5kYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZShcIi5jb25jYXQocG9pbnQueCwgXCIsIFwiKS5jb25jYXQocG9pbnQueSwgXCIpXCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNHcm91cDtcbn0oSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY0dyb3VwIH07XG5hcHBseU1peGlucyhJc29tZXRyaWNHcm91cCwgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QpO1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljR3JvdXAgfSBmcm9tICcuL0lzb21ldHJpY0dyb3VwJztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBnZXRTVkdQYXRoLCBnZXRUZXh0dXJlQ29ybmVyLCBlbGVtZW50SGFzU1ZHUGFyZW50IH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG5pbXBvcnQgeyBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgfSBmcm9tICcuLi9Jc29tZXRyaWNHcmFwaGljQWJzdHJhY3QnO1xudmFyIElzb21ldHJpY1BhdGhBYnN0cmFjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1BhdGhBYnN0cmFjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNQYXRoQWJzdHJhY3QocHJvcHMsIHN2Z0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLCBzdmdFbGVtZW50KSB8fCB0aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNQYXRoQWJzdHJhY3QucHJvdG90eXBlLnVwZGF0ZUdyYXBoaWMgPSBmdW5jdGlvbiAocGxhbmVWaWV3LCBhdXRvY2xvc2UpIHtcbiAgICAgICAgaWYgKGF1dG9jbG9zZSA9PT0gdm9pZCAwKSB7IGF1dG9jbG9zZSA9IHRydWU7IH1cbiAgICAgICAgaWYgKGVsZW1lbnRIYXNTVkdQYXJlbnQodGhpcy5lbGVtZW50KSkge1xuICAgICAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy5nZXRDb21tYW5kcygpO1xuICAgICAgICAgICAgdmFyIGNvcm5lciA9IGdldFRleHR1cmVDb3JuZXIoY29tbWFuZHMsIHRoaXMuZGF0YS5jZW50ZXJYLCB0aGlzLmRhdGEuY2VudGVyWSwgdGhpcy5kYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgZDogZ2V0U1ZHUGF0aChjb21tYW5kcywgdGhpcy5kYXRhLmNlbnRlclgsIHRoaXMuZGF0YS5jZW50ZXJZLCB0aGlzLmRhdGEuc2NhbGUsIGF1dG9jbG9zZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYXR0ZXJuVHJhbnNmb3JtKGNvcm5lciwgcGxhbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQW5pbWF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSXNvbWV0cmljUGF0aEFic3RyYWN0O1xufShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1BhdGhBYnN0cmFjdCB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljUGF0aEFic3RyYWN0IH0gZnJvbSAnLi9Jc29tZXRyaWNQYXRoQWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgeyBTVkdfRUxFTUVOVFMgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IGFkZFNWR1Byb3BlcnRpZXMgfSBmcm9tICdAdXRpbHMvc3ZnJztcbmltcG9ydCB7IGFwcGx5TWl4aW5zIH0gZnJvbSAnQHV0aWxzL290aGVyJztcbmltcG9ydCB7IElzb21ldHJpY1BhdGhBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1BhdGhBYnN0cmFjdCc7XG5pbXBvcnQgeyBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0JztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG59O1xudmFyIElzb21ldHJpY1NoYXBlQWJzdHJhY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJc29tZXRyaWNTaGFwZUFic3RyYWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1NoYXBlQWJzdHJhY3QocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkZWZhdWx0UHJvcHMpLCBwcm9wcyksIFNWR19FTEVNRU5UUy5wYXRoKSB8fCB0aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNTaGFwZUFic3RyYWN0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlR3JhcGhpYyh0aGlzLnBsYW5lVmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljU2hhcGVBYnN0cmFjdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICBkOiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljU2hhcGVBYnN0cmFjdC5wcm90b3R5cGUsIFwicGxhbmVWaWV3XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5wbGFuZVZpZXc7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnBsYW5lVmlldyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBJc29tZXRyaWNTaGFwZUFic3RyYWN0O1xufShJc29tZXRyaWNQYXRoQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1NoYXBlQWJzdHJhY3QgfTtcbmFwcGx5TWl4aW5zKElzb21ldHJpY1NoYXBlQWJzdHJhY3QsIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0KTtcbiIsImV4cG9ydCB7IElzb21ldHJpY1NoYXBlQWJzdHJhY3QgfSBmcm9tICcuL0lzb21ldHJpY1NoYXBlQWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IENvbW1hbmQsIFBsYW5lVmlldywgU1ZHX0VMRU1FTlRTLCBTVkdfTkFNRVNQQUNFLCB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0U1ZHUGF0aCwgdHJhbnNsYXRlQ29tbWFuZFBvaW50cywgYWRkU1ZHUHJvcGVydGllcywgaXNTVkdQcm9wZXJ0eSwgZ2V0QW5pbWF0aW9uUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgSXNvbWV0cmljU2hhcGVBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1NoYXBlQWJzdHJhY3QnO1xudmFyIElzb21ldHJpY1JlY3RhbmdsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1JlY3RhbmdsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNSZWN0YW5nbGUocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGhlaWdodCA9IHByb3BzLmhlaWdodCwgd2lkdGggPSBwcm9wcy53aWR0aCwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJlc3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl93aWR0aCA9IHdpZHRoO1xuICAgICAgICBfdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY1JlY3RhbmdsZS5wcm90b3R5cGUuZ2V0Q29tbWFuZHMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICB2YXIgcmlnaHQgPSAoX2EgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MucmlnaHQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmlnaHQ7XG4gICAgICAgIHZhciBsZWZ0ID0gKF9iID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLmxlZnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMubGVmdDtcbiAgICAgICAgdmFyIHRvcCA9IChfYyA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy50b3ApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRoaXMudG9wO1xuICAgICAgICB2YXIgd2lkdGggPSAoX2QgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3Mud2lkdGgpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHRoaXMud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSAoX2UgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvbW1hbmRzID0gW3sgY29tbWFuZDogQ29tbWFuZC5tb3ZlLCBwb2ludDogeyByOiAwLCBsOiAwLCB0OiAwIH0gfV07XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFuZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgUGxhbmVWaWV3LkZST05UOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IDAsIGw6IHdpZHRoLCB0OiAwIH0gfSwgeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IDAsIGw6IHdpZHRoLCB0OiBoZWlnaHQgfSB9LCB7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogMCwgbDogMCwgdDogaGVpZ2h0IH0gfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5TSURFOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IHdpZHRoLCBsOiAwLCB0OiAwIH0gfSwgeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IHdpZHRoLCBsOiAwLCB0OiBoZWlnaHQgfSB9LCB7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogMCwgbDogMCwgdDogaGVpZ2h0IH0gfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5UT1A6XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogd2lkdGgsIGw6IDAsIHQ6IDAgfSB9LCB7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogd2lkdGgsIGw6IGhlaWdodCwgdDogMCB9IH0sIHsgY29tbWFuZDogQ29tbWFuZC5saW5lLCBwb2ludDogeyByOiAwLCBsOiBoZWlnaHQsIHQ6IDAgfSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVDb21tYW5kUG9pbnRzKGNvbW1hbmRzLCByaWdodCwgbGVmdCwgdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH07XG4gICAgSXNvbWV0cmljUmVjdGFuZ2xlLnByb3RvdHlwZS5nZXRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy5nZXRDb21tYW5kcyhhcmdzKTtcbiAgICAgICAgcmV0dXJuIGdldFNWR1BhdGgoY29tbWFuZHMsIHRoaXMuZGF0YS5jZW50ZXJYLCB0aGlzLmRhdGEuY2VudGVyWSwgdGhpcy5kYXRhLnNjYWxlLCB0cnVlKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1JlY3RhbmdsZS5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghaXNOYXRpdmVTVkdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IF90aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBfdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IF90aGlzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IF90aGlzLmhlaWdodFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgYW5pbWF0aW9uLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IGdldEFuaW1hdGlvblByb3BlcnRpZXMoX3RoaXMuZ2V0UmVjdGFuZ2xlUGF0aC5iaW5kKF90aGlzKSwgYW5pbWF0aW9uLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUy5hbmltYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5pbWF0aW9uLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygnZCcsIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljUmVjdGFuZ2xlLnByb3RvdHlwZSwgXCJ3aWR0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljUmVjdGFuZ2xlLnByb3RvdHlwZSwgXCJoZWlnaHRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJc29tZXRyaWNSZWN0YW5nbGUucHJvdG90eXBlLmFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYWRkQW5pbWF0aW9uLmNhbGwodGhpcywgYW5pbWF0aW9uKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNSZWN0YW5nbGU7XG59KElzb21ldHJpY1NoYXBlQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1JlY3RhbmdsZSB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljUmVjdGFuZ2xlIH0gZnJvbSAnLi9Jc29tZXRyaWNSZWN0YW5nbGUnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IENvbW1hbmQsIFBsYW5lVmlldywgU1ZHX0VMRU1FTlRTLCBTVkdfTkFNRVNQQUNFIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRTVkdQYXRoLCB0cmFuc2xhdGVDb21tYW5kUG9pbnRzLCBhZGRTVkdQcm9wZXJ0aWVzLCBpc1NWR1Byb3BlcnR5LCBnZXRBbmltYXRpb25Qcm9wZXJ0aWVzIH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG5pbXBvcnQgeyBJc29tZXRyaWNTaGFwZUFic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU2hhcGVBYnN0cmFjdCc7XG52YXIgSXNvbWV0cmljQ2lyY2xlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljQ2lyY2xlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY0NpcmNsZShwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmFkaXVzID0gcHJvcHMucmFkaXVzLCByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJyYWRpdXNcIl0pO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJlc3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9yYWRpdXMgPSByYWRpdXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljQ2lyY2xlLnByb3RvdHlwZS5nZXRDb21tYW5kcyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgdmFyIHJpZ2h0ID0gKF9hID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLnJpZ2h0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnJpZ2h0O1xuICAgICAgICB2YXIgbGVmdCA9IChfYiA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy5sZWZ0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLmxlZnQ7XG4gICAgICAgIHZhciB0b3AgPSAoX2MgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MudG9wKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0aGlzLnRvcDtcbiAgICAgICAgdmFyIHJhZGl1cyA9IChfZCA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy5yYWRpdXMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHRoaXMucmFkaXVzO1xuICAgICAgICB2YXIgY29tbWFuZHMgPSBbXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYW5lVmlldykge1xuICAgICAgICAgICAgY2FzZSBQbGFuZVZpZXcuRlJPTlQ6XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQubW92ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IHsgcjogMCwgbDogcmFkaXVzLCB0OiAwIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6IDAsIGw6IC1yYWRpdXMsIHQ6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbDogeyByOiAwLCBsOiAwLCB0OiAtcmFkaXVzIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6IDAsIGw6IHJhZGl1cywgdDogMCB9LFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sOiB7IHI6IDAsIGw6IDAsIHQ6IHJhZGl1cyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5TSURFOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6IC1yYWRpdXMsIGw6IDAsIHQ6IDAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5jdXJ2ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IHsgcjogcmFkaXVzLCBsOiAwLCB0OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHsgcjogMCwgbDogMCwgdDogLXJhZGl1cyB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLmN1cnZlLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiAtcmFkaXVzLCBsOiAwLCB0OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHsgcjogMCwgbDogMCwgdDogcmFkaXVzIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGxhbmVWaWV3LlRPUDpcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5tb3ZlLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiAwLCBsOiByYWRpdXMsIHQ6IDAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5jdXJ2ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IHsgcjogMCwgbDogLXJhZGl1cywgdDogMCB9LFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sOiB7IHI6IHJhZGl1cywgbDogMCwgdDogMCB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLmN1cnZlLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiAwLCBsOiByYWRpdXMsIHQ6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbDogeyByOiAtcmFkaXVzLCBsOiAwLCB0OiAwIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVDb21tYW5kUG9pbnRzKGNvbW1hbmRzLCByaWdodCwgbGVmdCwgdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ2lyY2xlLnByb3RvdHlwZS5nZXRDaXJjbGVQYXRoID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy5nZXRDb21tYW5kcyhhcmdzKTtcbiAgICAgICAgcmV0dXJuIGdldFNWR1BhdGgoY29tbWFuZHMsIHRoaXMuZGF0YS5jZW50ZXJYLCB0aGlzLmRhdGEuY2VudGVyWSwgdGhpcy5kYXRhLnNjYWxlLCB0cnVlKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NpcmNsZS5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghaXNOYXRpdmVTVkdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IF90aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBfdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBfdGhpcy5yYWRpdXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvcHMsIGFuaW1hdGlvbi5wcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBnZXRBbmltYXRpb25Qcm9wZXJ0aWVzKF90aGlzLmdldENpcmNsZVBhdGguYmluZChfdGhpcyksIGFuaW1hdGlvbiwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMuYW5pbWF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGRBbmltYXRpb25CYXNpY1Byb3BlcnRpZXMoJ2QnLCBhbmltYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKGFuaW1hdGlvbi5lbGVtZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0NpcmNsZS5wcm90b3R5cGUsIFwicmFkaXVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFkaXVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFkaXVzID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgSXNvbWV0cmljQ2lyY2xlLnByb3RvdHlwZS5hZGRBbmltYXRpb24gPSBmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmFkZEFuaW1hdGlvbi5jYWxsKHRoaXMsIGFuaW1hdGlvbik7XG4gICAgfTtcbiAgICByZXR1cm4gSXNvbWV0cmljQ2lyY2xlO1xufShJc29tZXRyaWNTaGFwZUFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNDaXJjbGUgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY0NpcmNsZSB9IGZyb20gJy4vSXNvbWV0cmljQ2lyY2xlJztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBDb21tYW5kLCBQbGFuZVZpZXcsIFNWR19FTEVNRU5UUywgU1ZHX05BTUVTUEFDRSwgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IGdldFNWR1BhdGgsIHRyYW5zbGF0ZUNvbW1hbmRQb2ludHMsIGFkZFNWR1Byb3BlcnRpZXMsIGlzU1ZHUHJvcGVydHksIGdldEFuaW1hdGlvblByb3BlcnRpZXMgfSBmcm9tICdAdXRpbHMvc3ZnJztcbmltcG9ydCB7IElzb21ldHJpY1NoYXBlQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTaGFwZUFic3RyYWN0JztcbnZhciBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0KHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByYWRpdXMgPSBwcm9wcy5yYWRpdXMsIHBvaW50cyA9IHByb3BzLnBvaW50cywgZGVuc2l0eSA9IHByb3BzLmRlbnNpdHksIF9hID0gcHJvcHMucm90YXRpb24sIHJvdGF0aW9uID0gX2EgPT09IHZvaWQgMCA/IDAgOiBfYSwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wicmFkaXVzXCIsIFwicG9pbnRzXCIsIFwiZGVuc2l0eVwiLCBcInJvdGF0aW9uXCJdKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCByZXN0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fcmFkaXVzID0gcmFkaXVzO1xuICAgICAgICBfdGhpcy5fcG9pbnRzID0gcG9pbnRzO1xuICAgICAgICBfdGhpcy5fZGVuc2l0eSA9IGRlbnNpdHk7XG4gICAgICAgIF90aGlzLl9yb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgICAgICBfdGhpcy5fc2VjdG9yID0gMiAqIE1hdGguUEkgLyBfdGhpcy5fcG9pbnRzO1xuICAgICAgICBfdGhpcy5faGFsZlNlY3RvciA9IF90aGlzLl9zZWN0b3IgLyAyO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmdldENvbW1hbmRzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICB2YXIgcmlnaHQgPSAoX2EgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MucmlnaHQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmlnaHQ7XG4gICAgICAgIHZhciBsZWZ0ID0gKF9iID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLmxlZnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMubGVmdDtcbiAgICAgICAgdmFyIHRvcCA9IChfYyA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy50b3ApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRoaXMudG9wO1xuICAgICAgICB2YXIgcmFkaXVzID0gKF9kID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLnJhZGl1cykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdGhpcy5yYWRpdXM7XG4gICAgICAgIHZhciBwb2ludHMgPSAoX2UgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MucG9pbnRzKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLl9wb2ludHM7XG4gICAgICAgIHZhciBkZW5zaXR5ID0gKF9mID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLmRlbnNpdHkpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHRoaXMuX2RlbnNpdHk7XG4gICAgICAgIHZhciByb3RhdGlvbiA9IChfZyA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy5yb3RhdGlvbikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5yb3RhdGlvbjtcbiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gdGhpcy5nZXQyRENvb3JkaW5hdGVzKHJhZGl1cywgcG9pbnRzLCBkZW5zaXR5LCByb3RhdGlvbik7XG4gICAgICAgIHZhciBjb21tYW5kcyA9IFtdO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhbmVWaWV3KSB7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5GUk9OVDpcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBpbmRleCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29tbWFuZC5tb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb21tYW5kLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogcG9pbnQueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0OiBwb2ludC55XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGFuZVZpZXcuU0lERTpcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBpbmRleCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29tbWFuZC5tb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb21tYW5kLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IHBvaW50LngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0OiBwb2ludC55XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGFuZVZpZXcuVE9QOlxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGluZGV4ID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDb21tYW5kLm1vdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbW1hbmQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcjogLXBvaW50LngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogLXBvaW50LnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVDb21tYW5kUG9pbnRzKGNvbW1hbmRzLCByaWdodCwgbGVmdCwgdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH07XG4gICAgSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC5wcm90b3R5cGUuX2dldFJhZGlhbkFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgICAgIHJldHVybiBhbmdsZSAqIE1hdGguUEkgLyAxODA7XG4gICAgfTtcbiAgICBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0LnByb3RvdHlwZS5fZ2V0SW5uZXJSYWRpdXMgPSBmdW5jdGlvbiAocmFkaXVzLCBwb2ludHMsIGRlbnNpdHkpIHtcbiAgICAgICAgcmV0dXJuIHJhZGl1cyAqIE1hdGguY29zKE1hdGguUEkgKiBkZW5zaXR5IC8gcG9pbnRzKSAvIE1hdGguY29zKE1hdGguUEkgKiAoZGVuc2l0eSAtIDEpIC8gcG9pbnRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmdldDJEQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAocmFkaXVzLCBwb2ludHMsIGRlbnNpdHksIHJvdGF0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBpbm5lclJhZGl1cyA9IHRoaXMuX2dldElubmVyUmFkaXVzKHJhZGl1cywgcG9pbnRzLCBkZW5zaXR5KTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoW10sIEFycmF5KHRoaXMuX3BvaW50cyksIHRydWUpLnJlZHVjZShmdW5jdGlvbiAocG9pbnRzLCBfdW5kZWZpbmVkLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIGFuZ2xlID0gaW5kZXggKiBfdGhpcy5fc2VjdG9yICsgMiAqIE1hdGguUEkgLSBfdGhpcy5fZ2V0UmFkaWFuQW5nbGUocm90YXRpb24pO1xuICAgICAgICAgICAgdmFyIGlubmVyQW5nbGUgPSBhbmdsZSArIF90aGlzLl9oYWxmU2VjdG9yO1xuICAgICAgICAgICAgdmFyIG9YID0gTWF0aC5zaW4oYW5nbGUpICogcmFkaXVzO1xuICAgICAgICAgICAgdmFyIG9ZID0gTWF0aC5jb3MoYW5nbGUpICogcmFkaXVzO1xuICAgICAgICAgICAgdmFyIGlYID0gTWF0aC5zaW4oaW5uZXJBbmdsZSkgKiBpbm5lclJhZGl1cztcbiAgICAgICAgICAgIHZhciBpWSA9IE1hdGguY29zKGlubmVyQW5nbGUpICogaW5uZXJSYWRpdXM7XG4gICAgICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBwb2ludHMsIHRydWUpLCBbXG4gICAgICAgICAgICAgICAgeyB4OiBvWCwgeTogb1kgfSxcbiAgICAgICAgICAgICAgICB7IHg6IGlYLCB5OiBpWSB9XG4gICAgICAgICAgICBdLCBmYWxzZSk7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmdldFBlbnRhZ3JhbVBhdGggPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgY29tbWFuZHMgPSB0aGlzLmdldENvbW1hbmRzKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZ2V0U1ZHUGF0aChjb21tYW5kcywgdGhpcy5kYXRhLmNlbnRlclgsIHRoaXMuZGF0YS5jZW50ZXJZLCB0aGlzLmRhdGEuc2NhbGUsIHRydWUpO1xuICAgIH07XG4gICAgSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghaXNOYXRpdmVTVkdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IF90aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBfdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBfdGhpcy5yYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50czogX3RoaXMuX3BvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVuc2l0eTogX3RoaXMuX2RlbnNpdHksXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBfdGhpcy5yb3RhdGlvblxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgYW5pbWF0aW9uLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IGdldEFuaW1hdGlvblByb3BlcnRpZXMoX3RoaXMuZ2V0UGVudGFncmFtUGF0aC5iaW5kKF90aGlzKSwgYW5pbWF0aW9uLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUy5hbmltYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5pbWF0aW9uLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygnZCcsIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC5wcm90b3R5cGUsIFwicmFkaXVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFkaXVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFkaXVzID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLCBcInJvdGF0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb247XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYWRkQW5pbWF0aW9uLmNhbGwodGhpcywgYW5pbWF0aW9uKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0O1xufShJc29tZXRyaWNTaGFwZUFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0IH07XG4iLCJleHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0IH0gZnJvbSAnLi9Jc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdCc7XG52YXIgSXNvbWV0cmljUGVudGFncmFtID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljUGVudGFncmFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1BlbnRhZ3JhbShwcm9wcykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzKSwgeyBwb2ludHM6IDUsIGRlbnNpdHk6IDIgfSkpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBJc29tZXRyaWNQZW50YWdyYW07XG59KElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1BlbnRhZ3JhbSB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljUGVudGFncmFtIH0gZnJvbSAnLi9Jc29tZXRyaWNQZW50YWdyYW0nO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbmltcG9ydCB7IElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0JztcbnZhciBJc29tZXRyaWNTdGFyUG9seWdvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1N0YXJQb2x5Z29uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1N0YXJQb2x5Z29uKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1N0YXJQb2x5Z29uLnByb3RvdHlwZSwgXCJwb2ludHNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb2ludHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlY3RvciA9IDIgKiBNYXRoLlBJIC8gdGhpcy5fcG9pbnRzO1xuICAgICAgICAgICAgdGhpcy5faGFsZlNlY3RvciA9IHRoaXMuX3NlY3RvciAvIDI7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1N0YXJQb2x5Z29uLnByb3RvdHlwZSwgXCJkZW5zaXR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVuc2l0eTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbnNpdHkgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gSXNvbWV0cmljU3RhclBvbHlnb247XG59KElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1N0YXJQb2x5Z29uIH07XG4iLCJleHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbiB9IGZyb20gJy4vSXNvbWV0cmljU3RhclBvbHlnb24nO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbmltcG9ydCB7IENvbW1hbmQsIFNWR19FTEVNRU5UUywgU1ZHX05BTUVTUEFDRSB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkU1ZHUHJvcGVydGllcywgcGFyc2VEcmF3Q29tbWFuZHMsIGdldFNWR1BhdGgsIGdldEFuaW1hdGlvblByb3BlcnRpZXMgfSBmcm9tICdAdXRpbHMvc3ZnJztcbmltcG9ydCB7IElzb21ldHJpY1BhdGhBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1BhdGhBYnN0cmFjdCc7XG52YXIgSXNvbWV0cmljUGF0aCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1BhdGgsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljUGF0aChwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMgPT09IHZvaWQgMCkgeyBwcm9wcyA9IHt9OyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLCBTVkdfRUxFTUVOVFMucGF0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZ2V0UGF0aEZyb21Db21tYW5kcyA9IGZ1bmN0aW9uIChjb21tYW5kcykgeyByZXR1cm4gZ2V0U1ZHUGF0aChwYXJzZURyYXdDb21tYW5kcyhcIlwiLmNvbmNhdChjb21tYW5kcykpLCBfdGhpcy5kYXRhLmNlbnRlclgsIF90aGlzLmRhdGEuY2VudGVyWSwgX3RoaXMuZGF0YS5zY2FsZSwgX3RoaXMuX2F1dG9jbG9zZSk7IH07XG4gICAgICAgIF90aGlzLmNvbW1hbmRzID0gW107XG4gICAgICAgIF90aGlzLl9hdXRvY2xvc2UgPSAnYXV0b2Nsb3NlJyBpbiBwcm9wc1xuICAgICAgICAgICAgPyBwcm9wcy5hdXRvY2xvc2VcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNQYXRoLnByb3RvdHlwZS51cGRhdGVTdWJDbGFzc0FuaW1hdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb24ucHJvcGVydHkgPT09ICdwYXRoJykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gZ2V0QW5pbWF0aW9uUHJvcGVydGllcyhfdGhpcy5nZXRQYXRoRnJvbUNvbW1hbmRzLmJpbmQoX3RoaXMpLCBhbmltYXRpb24pO1xuICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLmFuaW1hdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChhbmltYXRpb24uZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygnZCcsIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhhbmltYXRpb24uZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUuZ2V0Q29tbWFuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRzO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1BhdGgucHJvdG90eXBlLCBcImF1dG9jbG9zZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jbG9zZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9jbG9zZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVHcmFwaGljKHVuZGVmaW5lZCwgdGhpcy5hdXRvY2xvc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKTtcbiAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHtcbiAgICAgICAgICAgIGQ6ICcnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uIChyaWdodCwgbGVmdCwgdG9wKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICBwb2ludDogeyByOiByaWdodCwgbDogbGVmdCwgdDogdG9wIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUubGluZVRvID0gZnVuY3Rpb24gKHJpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgICAgICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQubGluZSxcbiAgICAgICAgICAgIHBvaW50OiB7IHI6IHJpZ2h0LCBsOiBsZWZ0LCB0OiB0b3AgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNQYXRoLnByb3RvdHlwZS5jdXJ2ZVRvID0gZnVuY3Rpb24gKGNvbnRyb2xSaWdodCwgY29udHJvbExlZnQsIGNvbnRyb2xUb3AsIHJpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgICAgICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICBjb250cm9sOiB7IHI6IGNvbnRyb2xSaWdodCwgbDogY29udHJvbExlZnQsIHQ6IGNvbnRyb2xUb3AgfSxcbiAgICAgICAgICAgIHBvaW50OiB7IHI6IHJpZ2h0LCBsOiBsZWZ0LCB0OiB0b3AgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNQYXRoLnByb3RvdHlwZS5tdCA9IGZ1bmN0aW9uIChyaWdodCwgbGVmdCwgdG9wKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmVUbyhyaWdodCwgbGVmdCwgdG9wKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24gKHJpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZVRvKHJpZ2h0LCBsZWZ0LCB0b3ApO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUuY3QgPSBmdW5jdGlvbiAoY29udHJvbFJpZ2h0LCBjb250cm9sTGVmdCwgY29udHJvbFRvcCwgcmlnaHQsIGxlZnQsIHRvcCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZVRvKGNvbnRyb2xSaWdodCwgY29udHJvbExlZnQsIGNvbnRyb2xUb3AsIHJpZ2h0LCBsZWZ0LCB0b3ApO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChjb21tYW5kcykge1xuICAgICAgICB0aGlzLmNvbW1hbmRzID0gcGFyc2VEcmF3Q29tbWFuZHMoY29tbWFuZHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLmFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYWRkQW5pbWF0aW9uLmNhbGwodGhpcywgYW5pbWF0aW9uKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNQYXRoO1xufShJc29tZXRyaWNQYXRoQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1BhdGggfTtcbiIsImV4cG9ydCAqIGZyb20gJy4vSXNvbWV0cmljUGF0aCc7XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUywgT1JJR0lOIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNHcmFwaGljQWJzdHJhY3QnO1xuaW1wb3J0IHsgZ2V0UG9pbnRGcm9tSXNvbWV0cmljUG9pbnQgfSBmcm9tICdAdXRpbHMvbWF0aCc7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBlbGVtZW50SGFzU1ZHUGFyZW50LCBnZXRQYXR0ZXJuVHJhbnNmb3JtLCBpc1NWR1Byb3BlcnR5IH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG52YXIgSXNvbWV0cmljVGV4dCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1RleHQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljVGV4dChwcm9wcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBwbGFuZVZpZXcgPSBwcm9wcy5wbGFuZVZpZXcsIF9iID0gcHJvcHMudGV4dCwgdGV4dCA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBfYyA9IHByb3BzLmZvbnRGYW1pbHksIGZvbnRGYW1pbHkgPSBfYyA9PT0gdm9pZCAwID8gJ0FyaWFsJyA6IF9jLCBfZCA9IHByb3BzLmZvbnRTaXplLCBmb250U2l6ZSA9IF9kID09PSB2b2lkIDAgPyAxMiA6IF9kLCBfZSA9IHByb3BzLmZvbnRTdHlsZSwgZm9udFN0eWxlID0gX2UgPT09IHZvaWQgMCA/ICdub3JtYWwnIDogX2UsIF9mID0gcHJvcHMuZm9udFdlaWdodCwgZm9udFdlaWdodCA9IF9mID09PSB2b2lkIDAgPyAnbm9ybWFsJyA6IF9mLCBfZyA9IHByb3BzLm9yaWdpbiwgb3JpZ2luID0gX2cgPT09IHZvaWQgMCA/IFsnY2VudGVyJywgJ2NlbnRlciddIDogX2csIF9oID0gcHJvcHMucmlnaHQsIHJpZ2h0ID0gX2ggPT09IHZvaWQgMCA/IDAgOiBfaCwgX2ogPSBwcm9wcy5sZWZ0LCBsZWZ0ID0gX2ogPT09IHZvaWQgMCA/IDAgOiBfaiwgX2sgPSBwcm9wcy50b3AsIHRvcCA9IF9rID09PSB2b2lkIDAgPyAwIDogX2ssIF9sID0gcHJvcHMucm90YXRpb24sIHJvdGF0aW9uID0gX2wgPT09IHZvaWQgMCA/IDAgOiBfbCwgX20gPSBwcm9wcy5zZWxlY3RhYmxlLCBzZWxlY3RhYmxlID0gX20gPT09IHZvaWQgMCA/IHRydWUgOiBfbSwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wicGxhbmVWaWV3XCIsIFwidGV4dFwiLCBcImZvbnRGYW1pbHlcIiwgXCJmb250U2l6ZVwiLCBcImZvbnRTdHlsZVwiLCBcImZvbnRXZWlnaHRcIiwgXCJvcmlnaW5cIiwgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJ0b3BcIiwgXCJyb3RhdGlvblwiLCBcInNlbGVjdGFibGVcIl0pO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJlc3QsIFNWR19FTEVNRU5UUy5ncm91cCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX29yaWdpbkhhc2ggPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIF9hW09SSUdJTi5DRU5URVJdID0gJ21pZGRsZScsXG4gICAgICAgICAgICBfYVtPUklHSU4uTEVGVF0gPSAnc3RhcnQnLFxuICAgICAgICAgICAgX2FbT1JJR0lOLlJJR0hUXSA9ICdlbmQnLFxuICAgICAgICAgICAgX2FbT1JJR0lOLlRPUF0gPSAnaGFuZ2luZycsXG4gICAgICAgICAgICBfYVtPUklHSU4uQk9UVE9NXSA9ICdiYXNlbGluZScsXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIF90aGlzLmNvbW1vbkFuaW1hdGlvbkF0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGU6ICdYTUwnLFxuICAgICAgICAgICAgYWRkaXRpdmU6ICdzdW0nLFxuICAgICAgICAgICAgZmlsbDogJ2ZyZWV6ZSdcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuZ2V0TWF0cml4VHJhbnNmb3JtID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtTWF0cml4ID0gZ2V0UGF0dGVyblRyYW5zZm9ybShfdGhpcy5nZXRQb3NpdGlvblRyYW5zZm9ybShwcm9wcyksIF90aGlzLnBsYW5lVmlldywgMSk7XG4gICAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQodHJhbnNmb3JtTWF0cml4LCBcIiByb3RhdGUoXCIpLmNvbmNhdChfdGhpcy5yb3RhdGlvbiwgXCIpXCIpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5fdGV4dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLnRleHQpO1xuICAgICAgICBfdGhpcy5fdHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLnRzcGFuKTtcbiAgICAgICAgX3RoaXMuX3RleHRFbGVtZW50LmFwcGVuZENoaWxkKF90aGlzLl90c3Bhbik7XG4gICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoX3RoaXMuX3RleHRFbGVtZW50KTtcbiAgICAgICAgX3RoaXMucGxhbmVWaWV3ID0gcGxhbmVWaWV3O1xuICAgICAgICBfdGhpcy5mb250RmFtaWx5ID0gZm9udEZhbWlseTtcbiAgICAgICAgX3RoaXMuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgX3RoaXMuZm9udFN0eWxlID0gZm9udFN0eWxlO1xuICAgICAgICBfdGhpcy5mb250V2VpZ2h0ID0gZm9udFdlaWdodDtcbiAgICAgICAgX3RoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gICAgICAgIF90aGlzLm9yaWdpbiA9IG9yaWdpbjtcbiAgICAgICAgX3RoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgX3RoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIF90aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgX3RoaXMucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICAgICAgX3RoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUuZ2V0UG9zaXRpb25UcmFuc2Zvcm0gPSBmdW5jdGlvbiAocHJvcHMsIGZyb21DZW50ZXIpIHtcbiAgICAgICAgaWYgKGZyb21DZW50ZXIgPT09IHZvaWQgMCkgeyBmcm9tQ2VudGVyID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gZ2V0UG9pbnRGcm9tSXNvbWV0cmljUG9pbnQoZnJvbUNlbnRlclxuICAgICAgICAgICAgPyB0aGlzLmRhdGEuY2VudGVyWFxuICAgICAgICAgICAgOiAwLCBmcm9tQ2VudGVyXG4gICAgICAgICAgICA/IHRoaXMuZGF0YS5jZW50ZXJZXG4gICAgICAgICAgICA6IDAsIHtcbiAgICAgICAgICAgIHI6IHByb3BzLnJpZ2h0LFxuICAgICAgICAgICAgbDogcHJvcHMubGVmdCxcbiAgICAgICAgICAgIHQ6IHByb3BzLnRvcFxuICAgICAgICB9LCB0aGlzLmRhdGEuc2NhbGUpO1xuICAgIH07XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICByb3RhdGlvbjogMCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgdmFyIGlzTmF0aXZlU1ZHUHJvcGVydHkgPSBpc1NWR1Byb3BlcnR5KGFuaW1hdGlvbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIWlzTmF0aXZlU1ZHUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBhbmltYXRpb24ucHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eV8xID0gYW5pbWF0aW9uLnByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNSb3RhdGlvbl8xID0gcHJvcGVydHlfMSA9PT0gJ3JvdGF0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1vblByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIF90aGlzLmNvbW1vbkFuaW1hdGlvbkF0dHJpYnV0ZXMpLCB7IHR5cGU6IGlzUm90YXRpb25fMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JvdGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0cmFuc2xhdGUnLCBiZWdpbjogJ2luZGVmaW5pdGUnIH0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFuaW1hdGlvbi52YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IF9fYXNzaWduKHsgdmFsdWVzOiBhbmltYXRpb24udmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JvdGF0aW9uXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGlmaWVkQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRBcmdzW3Byb3BlcnR5XzFdID0gK3ZhbHVlIC0gX3RoaXNbcHJvcGVydHlfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvb3JkcyA9IF90aGlzLmdldFBvc2l0aW9uVHJhbnNmb3JtKG1vZGlmaWVkQXJncywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChjb29yZHMueCwgXCIsXCIpLmNvbmNhdChjb29yZHMueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJzsnKSB9LCBjb21tb25Qcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSb3RhdGlvbl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBfX2Fzc2lnbih7IHZhbHVlczogXCJcIi5jb25jYXQoYW5pbWF0aW9uLnZhbHVlcykgfSwgY29tbW9uUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGlmaWVkQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQXJnc1twcm9wZXJ0eV8xXSA9ICthbmltYXRpb24udmFsdWVzIC0gX3RoaXNbcHJvcGVydHlfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29yZHMgPSBfdGhpcy5nZXRQb3NpdGlvblRyYW5zZm9ybShtb2RpZmllZEFyZ3MsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IF9fYXNzaWduKHsgdmFsdWVzOiBcIlwiLmNvbmNhdChjb29yZHMueCwgXCIsXCIpLmNvbmNhdChjb29yZHMueSkgfSwgY29tbW9uUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JvdGF0aW9uXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gX19hc3NpZ24oeyBmcm9tOiBcIlwiLmNvbmNhdChhbmltYXRpb24uZnJvbSksIHRvOiBcIlwiLmNvbmNhdChhbmltYXRpb24udG8pIH0sIGNvbW1vblByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcm9tQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUFyZ3NbcHJvcGVydHlfMV0gPSArYW5pbWF0aW9uLmZyb20gLSBfdGhpc1twcm9wZXJ0eV8xXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0FyZ3NbcHJvcGVydHlfMV0gPSArYW5pbWF0aW9uLnRvIC0gX3RoaXNbcHJvcGVydHlfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvb3Jkc0Zyb20gPSBfdGhpcy5nZXRQb3NpdGlvblRyYW5zZm9ybShmcm9tQXJncywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29yZHNUbyA9IF90aGlzLmdldFBvc2l0aW9uVHJhbnNmb3JtKHRvQXJncywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBfX2Fzc2lnbih7IGZyb206IFwiXCIuY29uY2F0KGNvb3Jkc0Zyb20ueCwgXCIsXCIpLmNvbmNhdChjb29yZHNGcm9tLnkpLCB0bzogXCJcIi5jb25jYXQoY29vcmRzVG8ueCwgXCIsXCIpLmNvbmNhdChjb29yZHNUby55KSB9LCBjb21tb25Qcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb24uZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLmFuaW1hdGVUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygndHJhbnNmb3JtJywgYW5pbWF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhhbmltYXRpb24uZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUm90YXRpb25fMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl90ZXh0RWxlbWVudC5hcHBlbmRDaGlsZChhbmltYXRpb24uZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50LmJlZ2luRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZWxlbWVudEhhc1NWR1BhcmVudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5nZXRNYXRyaXhUcmFuc2Zvcm0oe1xuICAgICAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMubGVmdCxcbiAgICAgICAgICAgICAgICB0b3A6IHRoaXMudG9wXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5fdGV4dEVsZW1lbnQsIHsgdHJhbnNmb3JtOiB0cmFuc2Zvcm0gfSk7XG4gICAgICAgICAgICB0aGlzLl90c3Bhbi50ZXh0Q29udGVudCA9IHRoaXMuX3RleHQ7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBhdHRlcm5UcmFuc2Zvcm0oeyB4OiAwLCB5OiAwIH0sIHRoaXMucGxhbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQW5pbWF0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJ0ZXh0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljVGV4dC5wcm90b3R5cGUsIFwicGxhbmVWaWV3XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGxhbmVWaWV3O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcGxhbmVWaWV3ID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1RleHQucHJvdG90eXBlLCBcImZvbnRGYW1pbHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb250RmFtaWx5O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9udEZhbWlseSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLl90c3Bhbiwge1xuICAgICAgICAgICAgICAgICdmb250LWZhbWlseSc6IHRoaXMuX2ZvbnRGYW1pbHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1RleHQucHJvdG90eXBlLCBcImZvbnRTaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9mb250U2l6ZSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLl90c3Bhbiwge1xuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBcIlwiLmNvbmNhdCh0aGlzLl9mb250U2l6ZSwgXCJweFwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljVGV4dC5wcm90b3R5cGUsIFwiZm9udFN0eWxlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFN0eWxlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuX3RzcGFuLCB7XG4gICAgICAgICAgICAgICAgJ2ZvbnQtc3R5bGUnOiBcIlwiLmNvbmNhdCh0aGlzLl9mb250U3R5bGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJmb250V2VpZ2h0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFdlaWdodDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvbnRXZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5fdHNwYW4sIHtcbiAgICAgICAgICAgICAgICAnZm9udC13ZWlnaHQnOiBcIlwiLmNvbmNhdCh0aGlzLl9mb250V2VpZ2h0KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljVGV4dC5wcm90b3R5cGUsIFwic2VsZWN0YWJsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RhYmxlID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5fdGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICctd2Via2l0LXVzZXItc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICctbW96LXVzZXItc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICctbXMtdXNlci1zZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXItc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwb2ludGVyLWV2ZW50cydcbiAgICAgICAgICAgICAgICAgICAgXS5tYXAoZnVuY3Rpb24gKGRlY2wpIHsgcmV0dXJuIFwiXCIuY29uY2F0KGRlY2wsIFwiOiBub25lXCIpOyB9KS5qb2luKCc7JylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJvcmlnaW5cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW47XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9vcmlnaW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuX29yaWdpbiwgdGV4dEFuY2hvciA9IF9hWzBdLCBhbGlnbm1lbnRCYXNlbGluZSA9IF9hWzFdO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLl90c3Bhbiwge1xuICAgICAgICAgICAgICAgICd0ZXh0LWFuY2hvcic6IHRoaXMuX29yaWdpbkhhc2hbdGV4dEFuY2hvcl0sXG4gICAgICAgICAgICAgICAgJ2FsaWdubWVudC1iYXNlbGluZSc6IHRoaXMuX29yaWdpbkhhc2hbYWxpZ25tZW50QmFzZWxpbmVdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJyaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JpZ2h0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJsZWZ0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGVmdDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1RleHQucHJvdG90eXBlLCBcInRvcFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvcDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b3AgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG9wID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJyb3RhdGlvblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW9uICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBJc29tZXRyaWNUZXh0O1xufShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1RleHQgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY1RleHQgfSBmcm9tICcuL0lzb21ldHJpY1RleHQnO1xuIiwiZXhwb3J0IHsgTGluZUNhcCwgTGluZUpvaW4sIFBsYW5lVmlldywgQXhpcyB9IGZyb20gJ0Bjb25zdGFudHMnO1xuZXhwb3J0IHsgSXNvbWV0cmljQ2FudmFzIH0gZnJvbSAnQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY0NhbnZhcyc7XG5leHBvcnQgeyBJc29tZXRyaWNHcm91cCB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNHcm91cCc7XG5leHBvcnQgeyBJc29tZXRyaWNSZWN0YW5nbGUgfSBmcm9tICdAY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljUmVjdGFuZ2xlJztcbmV4cG9ydCB7IElzb21ldHJpY0NpcmNsZSB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNDaXJjbGUnO1xuZXhwb3J0IHsgSXNvbWV0cmljUGVudGFncmFtIH0gZnJvbSAnQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1BlbnRhZ3JhbSc7XG5leHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbiB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNTdGFyUG9seWdvbic7XG5leHBvcnQgeyBJc29tZXRyaWNQYXRoIH0gZnJvbSAnQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1BhdGgnO1xuZXhwb3J0IHsgSXNvbWV0cmljVGV4dCB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNUZXh0JztcbiIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljUmVjdGFuZ2xlLCBQbGFuZVZpZXcgfSA9IElzb21ldHJpY01vZHVsZTtcblxuICAgIGZ1bmN0aW9uIHRvZ2dsZUNvbG9yKCkge1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IHRoaXMuZmlsbENvbG9yID09PSAnd2hpdGUnID8gJyNFRUUnIDogJ3doaXRlJztcbiAgICB9XG5cbiAgICBjb25zdCBjdWJlID0gbmV3IElzb21ldHJpY0NhbnZhcyh7XG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0NDQycsXG4gICAgICAgIHNjYWxlOiAxMjAsXG4gICAgICAgIHdpZHRoOiA1MDAsXG4gICAgICAgIGhlaWdodDogMzIwXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21tb25Qcm9wcyA9IHtoZWlnaHQ6IDEsIHdpZHRoOiAxfTtcbiAgICBjb25zdCB0b3BQaWVjZSA9IG5ldyBJc29tZXRyaWNSZWN0YW5nbGUoey4uLmNvbW1vblByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5UT1B9KTtcbiAgICBjb25zdCByaWdodFBpZWNlID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7Li4uY29tbW9uUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LkZST05UfSk7XG4gICAgY29uc3QgbGVmdFBpZWNlID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7Li4uY29tbW9uUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LlNJREV9KTtcblxuICAgIHRvcFBpZWNlLnRvcCA9IDE7XG4gICAgdG9wUGllY2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVDb2xvciwgdHJ1ZSk7XG5cbiAgICByaWdodFBpZWNlLnJpZ2h0ID0gMTtcbiAgICByaWdodFBpZWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlQ29sb3IsIHRydWUpO1xuXG4gICAgbGVmdFBpZWNlLmxlZnQgPSAxO1xuICAgIGxlZnRQaWVjZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUNvbG9yLCB0cnVlKTtcblxuICAgIGN1YmVcbiAgICAgICAgLmFkZENoaWxkKHRvcFBpZWNlKVxuICAgICAgICAuYWRkQ2hpbGQocmlnaHRQaWVjZSlcbiAgICAgICAgLmFkZENoaWxkKGxlZnRQaWVjZSk7XG5cbn07IiwiZXhwb3J0IGRlZmF1bHQgKCBJc29tZXRyaWNNb2R1bGUsIGNvbnRhaW5lciApID0+IHtcblxuICAgIGNvbnN0IHsgSXNvbWV0cmljQ2FudmFzLCBJc29tZXRyaWNQYXRoLCBJc29tZXRyaWNSZWN0YW5nbGUsIElzb21ldHJpY1BlbnRhZ3JhbSwgUGxhbmVWaWV3IH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBjdWJlID0gbmV3IElzb21ldHJpY0NhbnZhcyh7XG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0NDQycsXG4gICAgICAgIHNjYWxlOiAxMjAsXG4gICAgICAgIHdpZHRoOiA1MDAsXG4gICAgICAgIGhlaWdodDogMzIwXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21tb25Qcm9wcyA9IHtoZWlnaHQ6IDEsIHdpZHRoOiAxfTtcblxuICAgIGNvbnN0IGR1cmF0aW9uID0gMztcblxuICAgIGNvbnN0IHJlY3RhbmdsZUFuaW1hdGlvblByb3BzID0ge1xuICAgICAgICBwcm9wZXJ0eTogJ2hlaWdodCcsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICB2YWx1ZXM6IFsxLCAwLjUsIDFdXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbG9yQW5pbWF0aW9uUHJvcHMgPSB7XG4gICAgICAgIHByb3BlcnR5OiAnZmlsbENvbG9yJyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHZhbHVlczogWycjRkZGJywgJyNEREQnLCAnI0ZGRiddXG4gICAgfTtcblxuICAgIGNvbnN0IHRvcFBpZWNlID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCBzdGFyID0gbmV3IElzb21ldHJpY1BlbnRhZ3JhbSh7IHJhZGl1czogMC4zNSwgcGxhbmVWaWV3OiBQbGFuZVZpZXcuVE9QLCByaWdodDogMC41LCBsZWZ0OiAwLjUsIHRvcDogMX0pO1xuICAgIGNvbnN0IHJpZ2h0UGllY2UgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsuLi5jb21tb25Qcm9wcywgcGxhbmVWaWV3OiBQbGFuZVZpZXcuRlJPTlQsIHJpZ2h0OiAxfSk7XG4gICAgY29uc3QgbGVmdFBpZWNlID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7Li4uY29tbW9uUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LlNJREUsIGxlZnQ6IDF9KTtcblxuICAgIHRvcFBpZWNlXG4gICAgICAgIC5tb3ZlVG8oMCwgMCwgMSlcbiAgICAgICAgLmxpbmVUbygxLCAwLCAxKVxuICAgICAgICAubGluZVRvKDEsIDEsIDEpXG4gICAgICAgIC5saW5lVG8oMCwgMSwgMSk7XG5cbiAgICB0b3BQaWVjZVxuICAgICAgICAuYWRkQW5pbWF0aW9uKHtcbiAgICAgICAgICAgIHByb3BlcnR5OiAncGF0aCcsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICAgICdNMCAwIDEgTDEgMCAxIEwxIDEgMSBMMCAxIDEnLFxuICAgICAgICAgICAgICAgICdNMCAwIDAuNSBMMSAwIDAuNSBMMSAxIDAuNSBMMCAxIDAuNScsXG4gICAgICAgICAgICAgICAgJ00wIDAgMSBMMSAwIDEgTDEgMSAxIEwwIDEgMSdcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgICAgLmFkZEFuaW1hdGlvbihjb2xvckFuaW1hdGlvblByb3BzKTtcblxuICAgIHN0YXJcbiAgICAgICAgLmFkZEFuaW1hdGlvbih7XG4gICAgICAgICAgICBwcm9wZXJ0eTogJ3RvcCcsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHZhbHVlczogWzEsIDAuNSwgMV1cbiAgICAgICAgfSk7XG5cbiAgICByaWdodFBpZWNlXG4gICAgICAgIC5hZGRBbmltYXRpb24ocmVjdGFuZ2xlQW5pbWF0aW9uUHJvcHMpXG4gICAgICAgIC5hZGRBbmltYXRpb24oY29sb3JBbmltYXRpb25Qcm9wcyk7XG5cbiAgICBsZWZ0UGllY2VcbiAgICAgICAgLmFkZEFuaW1hdGlvbihyZWN0YW5nbGVBbmltYXRpb25Qcm9wcylcbiAgICAgICAgLmFkZEFuaW1hdGlvbihjb2xvckFuaW1hdGlvblByb3BzKTtcblxuICAgIGN1YmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2VBbmltYXRpb25zKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZUFuaW1hdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY3ViZS5hZGRDaGlsZHJlbih0b3BQaWVjZSwgcmlnaHRQaWVjZSwgbGVmdFBpZWNlLCBzdGFyKTtcblxufTsiLCJpbXBvcnQgJy4uL2ltYWdlcy9ibG9ja19zaWRlLnBuZyc7XG5pbXBvcnQgJy4uL2ltYWdlcy9ibG9ja190b3AucG5nJztcblxuZXhwb3J0IGRlZmF1bHQgKCBJc29tZXRyaWNNb2R1bGUsIGNvbnRhaW5lciApID0+IHtcblxuICAgIGNvbnN0IHsgSXNvbWV0cmljQ2FudmFzLCBJc29tZXRyaWNSZWN0YW5nbGUsIElzb21ldHJpY1RleHQsIFBsYW5lVmlldyB9ID0gSXNvbWV0cmljTW9kdWxlO1xuXG4gICAgY29uc3QgY3ViZSA9IG5ldyBJc29tZXRyaWNDYW52YXMoe1xuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNDQ0MnLFxuICAgICAgICBzY2FsZTogMTIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVjdGFuZ2xlQ29tbW9uUHJvcHMgPSB7IGhlaWdodDogMSwgd2lkdGg6IDEgfTtcblxuICAgIGNvbnN0IHRleHRDb21tb25Qcm9wcyA9IHtcbiAgICAgICAgZm9udFNpemU6IDE1LFxuICAgICAgICBmaWxsQ29sb3I6ICcjNjY2JyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAsXG4gICAgICAgIHJpZ2h0OiAwLjUsXG4gICAgICAgIGxlZnQ6IDAuNSxcbiAgICAgICAgdG9wOiAwLjUsXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGNvbnN0IHBpZWNlcyA9IFtQbGFuZVZpZXcuVE9QLCBQbGFuZVZpZXcuRlJPTlQsIFBsYW5lVmlldy5TSURFXS5tYXAoKHZpZXcsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmYWNlOiBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsuLi5yZWN0YW5nbGVDb21tb25Qcm9wcywgcGxhbmVWaWV3OiB2aWV3fSksXG4gICAgICAgICAgICBsYWJlbDogbmV3IElzb21ldHJpY1RleHQoey4uLnRleHRDb21tb25Qcm9wcywgcGxhbmVWaWV3OiB2aWV3fSksXG4gICAgICAgICAgICBwcm9wZXJ0eTogWyd0b3AnLCAncmlnaHQnLCAnbGVmdCddW2luZGV4XVxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgcGllY2VzLmZvckVhY2goKHBpZWNlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgeyBmYWNlLCBsYWJlbCwgcHJvcGVydHkgfSA9IHBpZWNlO1xuXG4gICAgICAgIGZhY2VbcHJvcGVydHldID0gMTtcbiAgICAgICAgbGFiZWxbcHJvcGVydHldID0gMTtcbiAgICAgICAgbGFiZWwudGV4dCA9IGAke3Byb3BlcnR5LnRvVXBwZXJDYXNlKCl9IDDCumA7XG5cbiAgICAgICAgZmFjZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uID0gbGFiZWwucm90YXRpb24gKyA0NTtcbiAgICAgICAgICAgIGxhYmVsLnJvdGF0aW9uID0gcm90YXRpb24gPT09IDM2MCA/IDAgOiByb3RhdGlvbjtcbiAgICAgICAgICAgIGxhYmVsLnRleHQgPSBsYWJlbC50ZXh0LnJlcGxhY2UoL1xcZCsvLCBsYWJlbC5yb3RhdGlvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1YmUuYWRkQ2hpbGQocGllY2UuZmFjZSk7XG4gICAgICAgIGN1YmUuYWRkQ2hpbGQocGllY2UubGFiZWwpO1xuICAgIH0pO1xuXG59OyIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljR3JvdXAsIElzb21ldHJpY1BhdGggfSA9IElzb21ldHJpY01vZHVsZTtcblxuICAgIGNvbnN0IGlzb21ldHJpYyA9IG5ldyBJc29tZXRyaWNDYW52YXMoe1xuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNDQ0MnLFxuICAgICAgICBzY2FsZTogMTIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm90dG9tVCA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG4gICAgY29uc3QgYm90dG9tUiA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG4gICAgY29uc3QgYm90dG9tTCA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG5cbiAgICBjb25zdCB0b3BUID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3BSID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3BMID0gbmV3IElzb21ldHJpY1BhdGgoKTtcblxuICAgIGJvdHRvbVQubXQoMCwgMCwgLjUpLmx0KDEsIDAsIC41KS5sdCgxLCAxLCAuNSkubHQoMCwgMSwgLjUpO1xuICAgIGJvdHRvbVIubXQoMSwgMCwgLjUpLmx0KDEsIDAsIDApLmx0KDEsIDEsIDApLmx0KDEsIDEsIC41KTtcbiAgICBib3R0b21MLm10KDEsIDEsIC41KS5sdCgxLCAxLCAwKS5sdCgwLCAxLCAwKS5sdCgwLCAxLCAuNSk7XG5cbiAgICB0b3BULm10KC4yNSwgLjI1LCAxKS5sdCguNzUsIC4yNSwgMSkubHQoLjc1LCAuNzUsIC43NSkubHQoLjI1LCAuNzUsIC43NSk7XG4gICAgdG9wUi5tdCguNzUsIC4yNSwgMSkubHQoLjc1LCAuNzUsIC43NSkubHQoLjc1LCAuNzUsIC4yNSkubHQoLjc1LCAuMjUsIC4yNSk7XG4gICAgdG9wTC5tdCguNzUsIC43NSwgLjc1KS5sdCguMjUsIC43NSwgLjc1KS5sdCguMjUsIC43NSwgLjI1KS5sdCguNzUsIC43NSwgLjI1KTtcblxuICAgIGNvbnN0IGJvdHRvbVBpZWNlID0gbmV3IElzb21ldHJpY0dyb3VwKCk7XG4gICAgY29uc3QgdG9wUGllY2UgPSBuZXcgSXNvbWV0cmljR3JvdXAoKTtcbiAgICB0b3BQaWVjZS50b3AgPSAuMjU7XG5cbiAgICBib3R0b21QaWVjZS5hZGRDaGlsZHJlbihib3R0b21ULCBib3R0b21SLCBib3R0b21MKTtcbiAgICB0b3BQaWVjZS5hZGRDaGlsZHJlbih0b3BULCB0b3BSLCB0b3BMKTtcblxuICAgIGxldCBmbGlwID0gdHJ1ZTtcblxuICAgIHRvcFBpZWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnJpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0ID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJpZ2h0ID0gZmxpcCA/IDAuMjUgOiAtMC4yNTtcbiAgICAgICAgZmxpcCA9ICFmbGlwO1xuICAgIH0pO1xuXG4gICAgaXNvbWV0cmljLmFkZENoaWxkcmVuKGJvdHRvbVBpZWNlLCB0b3BQaWVjZSk7XG5cbn07IiwiZXhwb3J0IGRlZmF1bHQgKCBJc29tZXRyaWNNb2R1bGUsIGNvbnRhaW5lciApID0+IHtcblxuICAgIGNvbnN0IHsgSXNvbWV0cmljQ2FudmFzLCBJc29tZXRyaWNQYXRoIH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBpc29tZXRyaWMgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjQ0NDJyxcbiAgICAgICAgc2NhbGU6IDEyMCxcbiAgICAgICAgd2lkdGg6IDUwMCxcbiAgICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9KTtcblxuICAgIGNvbnN0IHJpZ2h0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3AxID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3AyID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3AzID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3A0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCBsZWZ0MSA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG4gICAgY29uc3QgbGVmdDIgPSBuZXcgSXNvbWV0cmljUGF0aCgpO1xuXG4gICAgLy8gTSByIGwgdCAoTW92ZSB0byByaWdodCBsZWZ0IHRvcClcbiAgICAvLyBMIHIgbCB0IChMaW5lIHRvIHJpZ2h0IGxlZnQgdG9wKVxuICAgIC8vIEMgY3IgY2wgY3QgciBsIHQgKEN1cnZlIHRvIGNvbnRyb2wtcmlnaHQgY29udHJvbC1sZWZ0IGNvbnRyb2wtdG9wIHJpZ2h0IGxlZnQgdG9wKVxuICAgIHJpZ2h0LmRyYXcoJ00xIDAgMCBMMSAxIDAgTDEgMSAwLjI1IEwxIDAuNSAwLjI1IEwxIDAuNSAxIEwxIDAgMScpO1xuICAgIHRvcDEuZHJhdygnTTAuMjUgMC41IDEgQzAuNSAwLjUgMC43NSAwLjc1IDAuNSAxIEwwLjc1IDAgMSBDMC41IDAgMC43NSAwLjI1IDAgMSBMMC4yNSAwLjUgMScpO1xuICAgIHRvcDIuZHJhdygnTTEgMCAxIEwwLjc1IDAgMSBMMC43NSAwLjUgMSBMMSAwLjUgMSBMMSAwIDEgTTAgMCAxIEwwLjI1IDAgMSBMMC4yNSAwLjUgMSBMMCAwLjUgMSBMMCAwIDEnKTtcbiAgICB0b3AzLmRyYXcoJ00wIDAuNSAwLjUgTDAuNSAwLjUgMC41IEwwLjUgMSAwLjUgTDAgMSAwLjUnKTtcbiAgICB0b3A0LmRyYXcoJ00wLjUgMC41IDAuNSBMMSAwLjUgMC4yNSBMMSAxIDAuMjUgTDAuNSAxIDAuNScpO1xuICAgIGxlZnQxLmRyYXcoJ00wIDAuNSAxIEwwIDAuNSAwLjUgTDAuNSAwLjUgMC41IEwxIDAuNSAwLjI1IEwxIDAuNSAxIEwwLjc1IDAuNSAxIEMwLjUgMC41IDAuNzUgMC4yNSAwLjUgMSBMMCAwLjUgMScpO1xuICAgIGxlZnQyLmRyYXcoJ00wIDEgMC41IEwwLjUgMSAwLjUgTDEgMSAwLjI1IEwxIDEgMCBMMCAxIDAnKTtcblxuICAgIGlzb21ldHJpYy5hZGRDaGlsZHJlbihyaWdodCwgdG9wMSwgdG9wMiwgdG9wMywgdG9wNCwgbGVmdDEsIGxlZnQyKTtcblxufTsiLCJleHBvcnQgZGVmYXVsdCAoIElzb21ldHJpY01vZHVsZSwgY29udGFpbmVyICkgPT4ge1xuXG4gICAgY29uc3QgeyBJc29tZXRyaWNDYW52YXMsIElzb21ldHJpY1BhdGggfSA9IElzb21ldHJpY01vZHVsZTtcblxuICAgIGNvbnN0IGN1YmUgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjQ0NDJyxcbiAgICAgICAgc2NhbGU6IDEyMCxcbiAgICAgICAgd2lkdGg6IDUwMCxcbiAgICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuZGVyID0gbmV3IElzb21ldHJpY1BhdGgoeyBmaWxsQ29sb3I6ICcjRUVFJyB9KTtcbiAgICBjb25zdCB0b3AgPSBuZXcgSXNvbWV0cmljUGF0aCgpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCBsZWZ0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcblxuICAgIHVuZGVyXG4gICAgICAgIC5tdCgwLCAwLCAxKVxuICAgICAgICAubXQoMC4yNSwgMCwgMSkuY3QoMC41LCAwLCAwLjc1LCAwLjc1LCAwLCAxKS5sdCgxLCAwLCAxKVxuICAgICAgICAubHQoMSwgMCwgMC43NSkuY3QoMC43NSwgMCwgMC41LCAxLCAwLCAwLjI1KS5sdCgxLCAwLCAwKVxuICAgICAgICAubHQoMSwgMC4yNSwgMCkuY3QoMC43NSwgMC41LCAwLCAxLCAwLjc1LCAwKS5sdCgxLCAxLCAwKVxuICAgICAgICAubHQoMC43NSwgMSwgMCkuY3QoMC41LCAwLjc1LCAwLCAwLjI1LCAxLCAwKS5sdCgwLCAxLCAwKVxuICAgICAgICAubHQoMCwgMSwgMC4yNSkuY3QoMCwgMC43NSwgMC41LCAwLCAxLCAwLjc1KS5sdCgwLCAxLCAxKVxuICAgICAgICAubHQoMCwgMC43NSwgMSkuY3QoMCwgMC41LCAwLjc1LCAwLCAwLjI1LCAxKS5sdCgwLCAwLCAxKTtcblxuICAgIHRvcFxuICAgICAgICAubXQoMCwgMCwgMSlcbiAgICAgICAgLmx0KDAuMjUsIDAsIDEpLmN0KDAuNSwgMC4yNSwgMSwgMC43NSwgMCwgMSkubHQoMSwgMCwgMSlcbiAgICAgICAgLmx0KDEsIDAuMjUsIDEpLmN0KDAuNzUsIDAuNSwgMSwgMSwgMC43NSwgMSkubHQoMSwgMSwgMSlcbiAgICAgICAgLmx0KDAuNzUsIDEsIDEpLmN0KDAuNSwgMC43NSwgMSwgMC4yNSwgMSwgMSkubHQoMCwgMSwgMSlcbiAgICAgICAgLmx0KDAsIDAuNzUsIDEpLmN0KDAuMjUsIDAuNSwgMSwgMCwgMC4yNSwgMSkubHQoMCwgMCwgMSk7XG5cbiAgICByaWdodFxuICAgICAgICAubXQoMSwgMCwgMSlcbiAgICAgICAgLmx0KDEsIDAsIDAuNzUpLmN0KDEsIDAuMjUsIDAuNSwgMSwgMCwgMC4yNSkubHQoMSwgMCwgMClcbiAgICAgICAgLmx0KDEsIDAuMjUsIDApLmN0KDEsIDAuNSwgMC4yNSwgMSwgMC43NSwgMCkubHQoMSwgMSwgMClcbiAgICAgICAgLmx0KDEsIDEsIDAuMjUpLmN0KDEsIDAuNzUsIDAuNSwgMSwgMSwgMC43NSkubHQoMSwgMSwgMSlcbiAgICAgICAgLmx0KDEsIDAuNzUsIDEpLmN0KDEsIDAuNSwgMC43NSwgMSwgMC4yNSwgMSkubHQoMSwgMCwgMSk7XG5cbiAgICBsZWZ0XG4gICAgICAgIC5tdCgxLCAxLCAxKVxuICAgICAgICAubHQoMSwgMSwgMC43NSkuY3QoMC43NSwgMSwgMC41LCAxLCAxLCAwLjI1KS5sdCgxLCAxLCAwKVxuICAgICAgICAubHQoMC43NSwgMSwgMCkuY3QoMC41LCAxLCAwLjI1LCAwLjI1LCAxLCAwKS5sdCgwLCAxLCAwKVxuICAgICAgICAubHQoMCwgMSwgMC4yNSkuY3QoMC4yNSwgMSwgMC41LCAwLCAxLCAwLjc1KS5sdCgwLCAxLCAxKVxuICAgICAgICAubHQoMC4yNSwgMSwgMSkuY3QoMC41LCAxLCAwLjc1LCAwLjc1LCAxLCAxKS5sdCgxLCAxLCAxKTtcblxuICAgIGN1YmUuYWRkQ2hpbGRyZW4odW5kZXIsIHRvcCwgcmlnaHQsIGxlZnQpO1xuXG59OyIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljU3RhclBvbHlnb24sIFBsYW5lVmlldyB9ID0gSXNvbWV0cmljTW9kdWxlO1xuXG4gICAgY29uc3QgY3ViZSA9IG5ldyBJc29tZXRyaWNDYW52YXMoe1xuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNDQ0MnLFxuICAgICAgICBzY2FsZTogMTIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICAgIHJhZGl1czogMC41LFxuICAgICAgICBwb2ludHM6IDgsXG4gICAgICAgIGRlbnNpdHk6IDIsXG4gICAgICAgIHJpZ2h0OiAwLjUsXG4gICAgICAgIGxlZnQ6IDAuNSxcbiAgICAgICAgdG9wOiAwLjVcbiAgICB9O1xuXG4gICAgY29uc3QgcGxhbmVzID0gW1BsYW5lVmlldy5TSURFLCBQbGFuZVZpZXcuRlJPTlQsIFBsYW5lVmlldy5UT1BdO1xuXG4gICAgY29uc3QgcGxhbmVQcm9wc0hhc2ggPSB7XG4gICAgICAgIFtQbGFuZVZpZXcuVE9QXTogJ3RvcCcsXG4gICAgICAgIFtQbGFuZVZpZXcuRlJPTlRdOiAncmlnaHQnLFxuICAgICAgICBbUGxhbmVWaWV3LlNJREVdOiAnbGVmdCdcbiAgICB9O1xuXG4gICAgcGxhbmVzLmZvckVhY2goKHBsYW5lVmlldykgPT4ge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uY29tbW9uUHJvcHMsIHBsYW5lVmlldyB9O1xuICAgICAgICBjb25zdCBjb29yZCA9IHBsYW5lUHJvcHNIYXNoW3BsYW5lVmlld107XG4gICAgICAgIGNvbnN0IHN0YXJQb2x5Z29uQmFjayA9IG5ldyBJc29tZXRyaWNTdGFyUG9seWdvbih7Li4ucHJvcHMsIGlkOiBgJHtjb29yZH0tYmFja2AsIGZpbGxDb2xvcjogJyNFRUUnfSk7XG4gICAgICAgIGNvbnN0IHN0YXJQb2x5Z29uRnJvbnQgPSBuZXcgSXNvbWV0cmljU3RhclBvbHlnb24oey4uLnByb3BzLCBpZDogYCR7Y29vcmR9LWZyb250YH0pO1xuICAgICAgICBzdGFyUG9seWdvbkJhY2tbY29vcmRdID0gMDtcbiAgICAgICAgc3RhclBvbHlnb25Gcm9udFtjb29yZF0gPSAxO1xuICAgICAgICBjdWJlLmFkZENoaWxkcmVuKHN0YXJQb2x5Z29uQmFjaywgc3RhclBvbHlnb25Gcm9udCk7XG4gICAgfSk7XG5cbiAgICBwbGFuZXMuZm9yRWFjaCgocGxhbmVWaWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gcGxhbmVQcm9wc0hhc2hbcGxhbmVWaWV3XTtcbiAgICAgICAgY29uc3Qgc3RhclBvbHlnb25CYWNrID0gY3ViZS5nZXRDaGlsZEJ5SWQoYCR7Y29vcmR9LWJhY2tgKTtcbiAgICAgICAgY29uc3Qgc3RhclBvbHlnb25Gcm9udCA9IGN1YmUuZ2V0Q2hpbGRCeUlkKGAke2Nvb3JkfS1mcm9udGApO1xuICAgICAgICBjdWJlLnNlbmRDaGlsZFRvQmFjayhzdGFyUG9seWdvbkJhY2spO1xuICAgICAgICBjdWJlLmJyaW5nQ2hpbGRUb0Zyb250KHN0YXJQb2x5Z29uRnJvbnQpO1xuICAgIH0pO1xuXG59OyIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljR3JvdXAsIElzb21ldHJpY1JlY3RhbmdsZSwgUGxhbmVWaWV3IH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBjYW52YXMgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjQ0NDJyxcbiAgICAgICAgc2NhbGU6IDIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gcmVzZXRQbGFuZXMoKSB7XG4gICAgICAgIGN1YmUucmlnaHQgPSBjdWJlLmxlZnQgPSBjdWJlLnRvcCA9IDA7XG4gICAgICAgIHBsYW5lVG9wLmZpbGxPcGFjaXR5ID0gcGxhbmVSaWdodC5maWxsT3BhY2l0eSA9IHBsYW5lTGVmdC5maWxsT3BhY2l0eSA9IDAuMjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hhbmdlUGxhbmUoKSB7XG4gICAgICAgIHJlc2V0UGxhbmVzKCk7XG4gICAgICAgIHRoaXMuZmlsbE9wYWNpdHkgPSAxO1xuICAgICAgICBjdWJlLmRyYWcgPSB0aGlzLnBsYW5lVmlldztcbiAgICB9XG5cbiAgICBjb25zdCBwbGFuZVByb3BzID0geyBoZWlnaHQ6IDYsIHdpZHRoOiA2LCBmaWxsT3BhY2l0eTogMC4yNSB9O1xuICAgIGNvbnN0IHBsYW5lVG9wID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7IC4uLnBsYW5lUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LlRPUCwgZmlsbE9wYWNpdHk6IDEgfSk7XG4gICAgY29uc3QgcGxhbmVSaWdodCA9IG5ldyBJc29tZXRyaWNSZWN0YW5nbGUoeyAuLi5wbGFuZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5GUk9OVCB9KTtcbiAgICBjb25zdCBwbGFuZUxlZnQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4ucGxhbmVQcm9wcywgcGxhbmVWaWV3OiBQbGFuZVZpZXcuU0lERSB9KTtcblxuICAgIGNvbnN0IGN1YmVQcm9wcyA9IHsgaGVpZ2h0OiAxLCB3aWR0aDogMSB9O1xuICAgIGNvbnN0IGN1YmVUb3AgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4uY3ViZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5UT1AsIHRvcDogMSB9KTtcbiAgICBjb25zdCBjdWJlUmlnaHQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4uY3ViZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5GUk9OVCwgcmlnaHQ6IDEgfSk7XG4gICAgY29uc3QgY3ViZUxlZnQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4uY3ViZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5TSURFLCBsZWZ0OiAxIH0pO1xuXG4gICAgY29uc3QgY3ViZSA9IG5ldyBJc29tZXRyaWNHcm91cCgpO1xuXG4gICAgY29uc3QgYm91bmRzID0gWzAsIDVdO1xuICAgIGN1YmUuZHJhZyA9ICdUT1AnO1xuICAgIGN1YmUuYm91bmRzID0geyB0b3A6IGJvdW5kcywgcmlnaHQ6IGJvdW5kcywgbGVmdDogYm91bmRzIH07XG5cbiAgICBwbGFuZVRvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYW5nZVBsYW5lLCB0cnVlKTtcbiAgICBwbGFuZVJpZ2h0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hhbmdlUGxhbmUsIHRydWUpO1xuICAgIHBsYW5lTGVmdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYW5nZVBsYW5lLCB0cnVlKTtcblxuICAgIGN1YmUuYWRkQ2hpbGRyZW4oY3ViZVRvcCwgY3ViZVJpZ2h0LCBjdWJlTGVmdCk7XG4gICAgY2FudmFzLmFkZENoaWxkcmVuKHBsYW5lVG9wLCBwbGFuZVJpZ2h0LCBwbGFuZUxlZnQsIGN1YmUpO1xuXG59OyIsImltcG9ydCAnLi4vaW1hZ2VzL2Jsb2NrX3NpZGUucG5nJztcbmltcG9ydCAnLi4vaW1hZ2VzL2Jsb2NrX3RvcC5wbmcnO1xuXG5leHBvcnQgZGVmYXVsdCAoIElzb21ldHJpY01vZHVsZSwgY29udGFpbmVyICkgPT4ge1xuXG4gICAgY29uc3QgeyBJc29tZXRyaWNDYW52YXMsIElzb21ldHJpY1BhdGgsIElzb21ldHJpY1JlY3RhbmdsZSwgUGxhbmVWaWV3LCBBeGlzIH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBpc29tZXRyaWMgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjOEFBQTNGJyxcbiAgICAgICAgc2NhbGU6IDEyMCxcbiAgICAgICAgd2lkdGg6IDUwMCxcbiAgICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbW1vblRleHR1cmVQcm9wcyA9IHtcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgcGl4ZWxhdGVkOiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0IHRleHR1cmVTaWRlcyA9IHtcbiAgICAgICAgdXJsOiAnaW1hZ2VzL2Jsb2NrX3NpZGUucG5nJyxcbiAgICAgICAgLi4uY29tbW9uVGV4dHVyZVByb3BzXG4gICAgfTtcblxuICAgIGNvbnN0IHRleHR1cmVUb3AgPSB7XG4gICAgICAgIHVybDogJ2ltYWdlcy9ibG9ja190b3AucG5nJyxcbiAgICAgICAgcGxhbmVWaWV3OiBQbGFuZVZpZXcuVE9QLFxuICAgICAgICByb3RhdGlvbjoge1xuICAgICAgICAgICAgYXhpczogQXhpcy5MRUZULFxuICAgICAgICAgICAgdmFsdWU6IDI2LjU2NTBcbiAgICAgICAgfSxcbiAgICAgICAgLi4uY29tbW9uVGV4dHVyZVByb3BzXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZGUgPSBuZXcgSXNvbWV0cmljUGF0aCh7XG4gICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHBsYW5lVmlldzogUGxhbmVWaWV3LlNJREUsXG4gICAgICAgICAgICAuLi50ZXh0dXJlU2lkZXNcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZnJvbnQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHtcbiAgICAgICAgcGxhbmVWaWV3OiBQbGFuZVZpZXcuRlJPTlQsXG4gICAgICAgIGhlaWdodDogMC41LFxuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgdGV4dHVyZTogdGV4dHVyZVNpZGVzXG4gICAgfSk7XG5cbiAgICBjb25zdCBjaG9wID0gbmV3IElzb21ldHJpY1BhdGgoe1xuICAgICAgICB0ZXh0dXJlOiB0ZXh0dXJlVG9wXG4gICAgfSk7XG5cbiAgICBzaWRlLmRyYXcoJ00xIDEgMCBMMSAxIDAuNSBMMCAxIDEgTDAgMSAwJyk7XG4gICAgY2hvcC5kcmF3KCdNMSAxIDAuNSBMMCAxIDEgTDAgMCAxIEwxIDAgMC41Jyk7XG5cbiAgICBzaWRlLmxlZnQgPSAxO1xuICAgIGZyb250LnJpZ2h0ID0gMTtcblxuICAgIGlzb21ldHJpYy5hZGRDaGlsZHJlbihzaWRlLCBmcm9udCwgY2hvcCk7XG5cbn07IiwiaW1wb3J0ICdnb29nbGUtY29kZS1wcmV0dGlmeS9iaW4vcnVuX3ByZXR0aWZ5Lm1pbic7XG5pbXBvcnQgJy4uL25vZGVfbW9kdWxlcy9nb29nbGUtY29kZS1wcmV0dGlmeS9iaW4vcHJldHRpZnkubWluLmNzcyc7XG5pbXBvcnQgJy4vdG9tb3Jyb3cubWluLmNzcyc7XG5pbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuaW1wb3J0ICogYXMgSXNvbWV0cmljTW9kdWxlIGZyb20gJy4uL3NyYyc7XG5pbXBvcnQgZGVtbzEgZnJvbSAnLi9kZW1vMSc7XG5pbXBvcnQgZGVtbzIgZnJvbSAnLi9kZW1vMic7XG5pbXBvcnQgZGVtbzMgZnJvbSAnLi9kZW1vMyc7XG5pbXBvcnQgZGVtbzQgZnJvbSAnLi9kZW1vNCc7XG5pbXBvcnQgZGVtbzUgZnJvbSAnLi9kZW1vNSc7XG5pbXBvcnQgZGVtbzYgZnJvbSAnLi9kZW1vNic7XG5pbXBvcnQgZGVtbzcgZnJvbSAnLi9kZW1vNyc7XG5pbXBvcnQgZGVtbzggZnJvbSAnLi9kZW1vOCc7XG5pbXBvcnQgZGVtbzkgZnJvbSAnLi9kZW1vOSc7XG5cbmNvbnN0IGZ1bmN0aW9Ub1N0cmluZyA9IChmbikgPT4ge1xuICAgIGNvbnN0IGFydGljbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhcnRpY2xlJyk7XG4gICAgY29uc3QgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgYXJ0aWNsZS5jbGFzc0xpc3QuYWRkKCdmdW5jdGlvbi1jb250YWluZXInKTtcbiAgICBwcmUuY2xhc3NMaXN0LmFkZCgncHJldHR5cHJpbnQnKTtcbiAgICBhcnRpY2xlLmFwcGVuZENoaWxkKHByZSk7XG4gICAgcHJlLmlubmVySFRNTCA9IGZuLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFydGljbGU7XG59O1xuXG5jb25zdCBkZW1vcyA9IG5ldyBNYXAoW1xuICAgIFsnZGVtbzEnLCBkZW1vMV0sXG4gICAgWydkZW1vMicsIGRlbW8yXSxcbiAgICBbJ2RlbW8zJywgZGVtbzNdLFxuICAgIFsnZGVtbzQnLCBkZW1vNF0sXG4gICAgWydkZW1vNScsIGRlbW81XSxcbiAgICBbJ2RlbW82JywgZGVtbzZdLFxuICAgIFsnZGVtbzcnLCBkZW1vN10sXG4gICAgWydkZW1vOCcsIGRlbW84XSxcbiAgICBbJ2RlbW85JywgZGVtbzldLFxuXSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZW1vcy5mb3JFYWNoKChtb2R1bGUsIGRpdikgPT4ge1xuICAgICAgICBjb25zdCBkZW1vID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2KTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVtby1jb250YWluZXInKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkZW1vLXdyYXBwZXInKTtcblxuICAgICAgICBtb2R1bGUoSXNvbWV0cmljTW9kdWxlLCB3cmFwcGVyKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgICAgICBkZW1vLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgICAgIGRlbW8uYXBwZW5kQ2hpbGQoZnVuY3Rpb1RvU3RyaW5nKG1vZHVsZSkpO1xuICAgIH0pO1xuXG59KTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///697\n')},966:(module,exports)=>{eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(){var r=null;\n(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",\nw,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j=0;){var M=A[m],T=M.src.match(/^[^#?]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=\n[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-\na[0]||a[1]-f[1]});b=[];g=[];for(a=0;ak[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],g=0,k=0;g=2&&f==="["?a[g]=b(o):f!=="\\\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,\ng),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\\S\\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\\\]|\\\\[\\S\\s]|\'\'?(?=[^\']))*(?:\'\'\'|$)|"""(?:[^"\\\\]|\\\\[\\S\\s]|""?(?=[^"]))*(?:"""|$)|\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$))/,\nr,"\'\\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,r,"\'\\"`"]):d.push(["str",/^(?:\'(?:[^\\n\\r\'\\\\]|\\\\.)*(?:\'|$)|"(?:[^\\n\\r"\\\\]|\\\\.)*(?:"|$))/,r,"\\"\'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,\nr,"#"]),h.push(["str",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,r])):d.push(["com",/^#[^\\n\\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\\/\\/[^\\n\\r]*/,r]),h.push(["com",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\\n\\r")?".":"[\\\\S\\\\s]";h.push(["lang-regex",RegExp("^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*("+\n("/(?=[^/*"+b+"])(?:[^/\\\\x5B\\\\x5C"+b+"]|\\\\x5C"+e+"|\\\\x5B(?:[^\\\\x5C\\\\x5D"+b+"]|\\\\x5C"+e+")*(?:\\\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\\s,]+/g,"|")+")\\\\b"),r]);d.push(["pln",/^\\s+/,r," \\r\\n\\t\\u00a0"]);b="^.[^\\\\s\\\\w.$@\'\\"`/\\\\\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,r],["pln",/^[$_a-z][\\w$@]*/i,r],["lit",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,\nr,"0123456789"],["pln",/^\\\\[\\S\\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}\nfunction e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\\s*=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],\n"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],\nL=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],\nN=[G,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nS=/\\S/,T=t({keywords:[J,L,O,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],["lang-",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],["lang-",/^<%([\\S\\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",\n/^]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],["lang-js",/^]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],["lang-css",/^]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],["lang-in.tag",/^(<\\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);i(C([["pln",/^\\s+/,r," \\t\\r\\n"],["atv",/^(?:"[^"]*"?|\'[^\']*\'?)/,r,"\\"\'"]],[["tag",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],["atn",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],["lang-uq.val",/^=\\s*([^\\s"\'>]*(?:[^\\s"\'/>]|\\/(?=\\s)))/],["pun",/^[/<->]+/],\n["lang-js",/^on\\w+\\s*=\\s*"([^"]+)"/i],["lang-js",/^on\\w+\\s*=\\s*\'([^\']+)\'/i],["lang-js",/^on\\w+\\s*=\\s*([^\\s"\'>]+)/i],["lang-css",/^style\\s*=\\s*"([^"]+)"/i],["lang-css",/^style\\s*=\\s*\'([^\']+)\'/i],["lang-css",/^style\\s*=\\s*([^\\s"\'>]+)/i]]),["in.tag"]);i(C([],[["atv",/^[\\S\\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),\n["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);i(t({keywords:N,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);\ni(C([],[["str",/^[\\S\\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},\nprettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p{for(var C in g)__webpack_require__.o(g,C)&&!__webpack_require__.o(I,C)&&Object.defineProperty(I,C,{enumerable:!0,get:g[C]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(I){if("object"==typeof window)return window}}(),__webpack_require__.o=(I,g)=>Object.prototype.hasOwnProperty.call(I,g),__webpack_require__.r=I=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},(()=>{var I;__webpack_require__.g.importScripts&&(I=__webpack_require__.g.location+"");var g=__webpack_require__.g.document;if(!I&&g&&(g.currentScript&&"SCRIPT"===g.currentScript.tagName.toUpperCase()&&(I=g.currentScript.src),!I)){var C=g.getElementsByTagName("script");if(C.length)for(var t=C.length-1;t>-1&&(!I||!/^http(s?):/.test(I));)I=C[t--].src}if(!I)throw new Error("Automatic publicPath is not supported in this browser");I=I.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),__webpack_require__.p=I+"../"})();var __webpack_exports__=__webpack_require__(697),__webpack_export_target__=window;for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__]=__webpack_exports__[__webpack_i__];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})(); \ No newline at end of file +(()=>{var __webpack_modules__={239:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// NAMESPACE OBJECT: ./src/index.ts\nvar src_namespaceObject = {};\n__webpack_require__.r(src_namespaceObject);\n__webpack_require__.d(src_namespaceObject, {\n Axis: () => (Axis),\n IsometricCanvas: () => (IsometricCanvas),\n IsometricCircle: () => (IsometricCircle),\n IsometricGroup: () => (IsometricGroup),\n IsometricPath: () => (IsometricPath),\n IsometricPentagram: () => (IsometricPentagram),\n IsometricRectangle: () => (IsometricRectangle),\n IsometricStarPolygon: () => (IsometricStarPolygon),\n IsometricText: () => (IsometricText),\n LineCap: () => (LineCap),\n LineJoin: () => (LineJoin),\n PlaneView: () => (PlaneView)\n});\n\n// EXTERNAL MODULE: ./node_modules/.pnpm/google-code-prettify@1.0.5/node_modules/google-code-prettify/bin/run_prettify.min.js\nvar run_prettify_min = __webpack_require__(966);\n;// ./src/@constants/index.ts\nvar SVG_NAMESPACE = \'http://www.w3.org/2000/svg\';\nvar SVG_ELEMENTS;\n(function (SVG_ELEMENTS) {\n SVG_ELEMENTS["svg"] = "svg";\n SVG_ELEMENTS["group"] = "g";\n SVG_ELEMENTS["path"] = "path";\n SVG_ELEMENTS["rect"] = "rect";\n SVG_ELEMENTS["text"] = "text";\n SVG_ELEMENTS["tspan"] = "tspan";\n SVG_ELEMENTS["pattern"] = "pattern";\n SVG_ELEMENTS["image"] = "image";\n SVG_ELEMENTS["animate"] = "animate";\n SVG_ELEMENTS["animateTransform"] = "animateTransform";\n})(SVG_ELEMENTS || (SVG_ELEMENTS = {}));\nvar SVG_PROPERTIES;\n(function (SVG_PROPERTIES) {\n SVG_PROPERTIES["viewBox"] = "viewBox";\n})(SVG_PROPERTIES || (SVG_PROPERTIES = {}));\nvar DECIMALS = 6;\nvar SQRT3 = +(Math.sqrt(3).toFixed(DECIMALS));\nvar HSQRT3 = +((Math.sqrt(3) / 2).toFixed(DECIMALS));\nvar DEFAULT_WIDTH = 640;\nvar DEFAULT_HEIGHT = 480;\nvar N = \'(-?\\\\d+(?:\\\\.\\\\d+)?|-?\\\\.\\\\d+)\';\nvar S = \'\\\\s*\';\nvar SS = \'\\\\s+\';\nvar POINT = "".concat(N).concat(SS).concat(N).concat(SS).concat(N);\nvar CURVE = "".concat(POINT).concat(SS).concat(POINT);\nvar COMMANDS_REGEXP = new RegExp("(?:(M|L)".concat(S).concat(POINT).concat(S, "|(C)").concat(S).concat(CURVE, ")").concat(S), \'g\');\nvar SCALE = Math.sqrt(3 / 2);\nvar ROT_60 = Math.PI / 3;\nvar ROT_45 = Math.PI / 4;\nvar ROT_CMA = Math.atan(Math.SQRT2);\nvar Colors;\n(function (Colors) {\n Colors["white"] = "white";\n Colors["black"] = "black";\n})(Colors || (Colors = {}));\nvar LineCap;\n(function (LineCap) {\n LineCap["butt"] = "butt";\n LineCap["square"] = "square";\n LineCap["round"] = "round";\n})(LineCap || (LineCap = {}));\nvar LineJoin;\n(function (LineJoin) {\n LineJoin["miter"] = "miter";\n LineJoin["round"] = "round";\n LineJoin["bevel"] = "bevel";\n})(LineJoin || (LineJoin = {}));\nvar Command;\n(function (Command) {\n Command["move"] = "move";\n Command["line"] = "line";\n Command["curve"] = "curve";\n})(Command || (Command = {}));\nvar PlaneView;\n(function (PlaneView) {\n PlaneView["FRONT"] = "FRONT";\n PlaneView["SIDE"] = "SIDE";\n PlaneView["TOP"] = "TOP";\n})(PlaneView || (PlaneView = {}));\nvar Axis;\n(function (Axis) {\n Axis["RIGHT"] = "RIGHT";\n Axis["LEFT"] = "LEFT";\n Axis["TOP"] = "TOP";\n})(Axis || (Axis = {}));\nvar Typeof;\n(function (Typeof) {\n Typeof["UNDEFINED"] = "undefined";\n Typeof["NUMBER"] = "number";\n})(Typeof || (Typeof = {}));\nvar EVENTS;\n(function (EVENTS) {\n EVENTS["MOUSE_MOVE"] = "mousemove";\n EVENTS["MOUSE_DOWN"] = "mousedown";\n EVENTS["MOUSE_UP"] = "mouseup";\n EVENTS["TOUCH_START"] = "touchstart";\n EVENTS["TOUCH_MOVE"] = "touchmove";\n EVENTS["TOUCH_END"] = "touchend";\n})(EVENTS || (EVENTS = {}));\nvar ORIGIN;\n(function (ORIGIN) {\n ORIGIN["CENTER"] = "center";\n ORIGIN["LEFT"] = "left";\n ORIGIN["RIGHT"] = "right";\n ORIGIN["TOP"] = "top";\n ORIGIN["BOTTOM"] = "bottom";\n})(ORIGIN || (ORIGIN = {}));\n\n;// ./src/@utils/math.ts\n\nvar round = function (n, d) {\n var exp = Math.pow(10, d);\n return Math.round(n * exp) / exp;\n};\nvar radian = function (a) { return a * Math.PI / 180; };\nvar sincos = function (r) { return ({\n sin: round(Math.sin(r), DECIMALS),\n cos: round(Math.cos(r), DECIMALS)\n}); };\nvar getPointsDiff = function (pointA, pointB) { return ({\n x: pointA.x - pointB.x,\n y: pointA.y - pointB.y\n}); };\nvar getPointsDistance = function (pointA, pointB) {\n var diff = getPointsDiff(pointA, pointB);\n return Math.sqrt(Math.pow(diff.x, 2) + Math.pow(diff.y, 2));\n};\nvar translatePoint = function (point, angle, distance) { return ({\n x: point.x + Math.cos(angle) * distance,\n y: point.y + Math.sin(angle) * distance\n}); };\nvar rotate = function (point, center, angle) {\n var diff = getPointsDiff(point, center);\n var x = diff.x * Math.cos(angle) - diff.y * Math.sin(angle);\n var y = diff.x * Math.sin(angle) + diff.y * Math.cos(angle);\n return {\n x: center.x + x,\n y: center.y + y\n };\n};\nvar getPointsAngle = function (pointA, pointB) {\n var diff = getPointsDiff(pointB, pointA);\n return Math.atan2(diff.y, diff.x);\n};\nvar getOrientation = function (p1, p2, p3) {\n var value = (p2.y - p1.y) * (p3.x - p2.x) - (p2.x - p1.x) * (p3.y - p2.y);\n return value >= 0 ? 0 : 1;\n};\nvar getPointFromIsometricPoint = function (centerX, centerY, point, scale) {\n return {\n x: round(centerX + (point.r - point.l) * scale * HSQRT3, DECIMALS),\n y: round(centerY + ((point.r + point.l) / 2 - point.t) * scale, DECIMALS)\n };\n};\nvar getTopPlanePointFromCoordinates = function (x, y) {\n var XHSQRT3 = x / HSQRT3;\n var right = (y * 2 + XHSQRT3) / 2;\n var left = right - XHSQRT3;\n return {\n right: right,\n left: left\n };\n};\nvar getFrontPlanePointFromCoordinates = function (x, y) {\n var left = -x / HSQRT3;\n var top = left / 2 - y;\n return {\n left: left,\n top: top\n };\n};\nvar getSidePlanePointFromCoordinates = function (x, y) {\n var right = x / HSQRT3;\n var top = right / 2 - y;\n return {\n right: right,\n top: top\n };\n};\nvar getEllipsisSpecs = function (pointA, pointB, control) {\n var diff = getPointsDiff(pointB, pointA);\n var center = { x: pointA.x + diff.x / 2, y: pointA.y + diff.y / 2 };\n var P = rotate(pointB, center, Math.PI / 2);\n var D = { x: P.x + (control.x - P.x) / 2, y: P.y + (control.y - P.y) / 2 };\n var radius = getPointsDistance(D, center);\n var U = translatePoint(D, getPointsAngle(D, P), radius);\n var V = translatePoint(D, getPointsAngle(D, control), radius);\n return [\n round(getPointsDistance(control, U), DECIMALS),\n round(getPointsDistance(control, V), DECIMALS),\n round(getPointsAngle(center, V) * 180 / Math.PI, DECIMALS)\n ];\n};\nvar randomId = function () { return Math.random().toString(16).slice(2); };\nvar uuid = function () { return Array.from(Array(3)).map(function () { return randomId(); }).join(\'-\'); };\n\n;// ./src/@utils/matrix.ts\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\nvar multiplyMatrix = function (m1, m2) { return (m1.map(function (row, i) { return (m2[0].map(function (_, j) {\n return row.reduce(function (acc, _, n) {\n return acc + m1[i][n] * m2[n][j];\n }, 0);\n})); })); };\nvar multiplyMatrices = function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i] = arguments[_i];\n }\n var matrix = m[0];\n for (var i = 1; i < m.length; i++) {\n matrix = multiplyMatrix(matrix, m[i]);\n }\n return matrix;\n};\nvar rotateX = function (r) {\n var sc = sincos(r);\n return [\n [1, 0, 0],\n [0, sc.cos, -sc.sin],\n [0, sc.sin, sc.cos]\n ];\n};\nvar rotateY = function (r) {\n var sc = sincos(r);\n return [\n [sc.cos, 0, sc.sin],\n [0, 1, 0],\n [-sc.sin, 0, sc.cos]\n ];\n};\nvar rotateZ = function (r) {\n var sc = sincos(r);\n return [\n [sc.cos, -sc.sin, 0],\n [sc.sin, sc.cos, 0],\n [0, 0, 1]\n ];\n};\nvar topMatrix = multiplyMatrices(rotateX(ROT_CMA), rotateZ(-ROT_45));\nvar frontMatrix = multiplyMatrices(rotateZ(-ROT_60), rotateX(ROT_CMA), rotateZ(ROT_45));\nvar sideMatrix = multiplyMatrices(rotateZ(ROT_60), rotateX(ROT_CMA), rotateZ(-ROT_45));\nvar rotationToRotationMatrix = function (view, rotation) {\n var value = radian(rotation.value);\n switch (view) {\n case PlaneView.TOP: {\n switch (rotation.axis) {\n case Axis.TOP:\n return rotateZ(value);\n case Axis.LEFT:\n return rotateX(-value);\n case Axis.RIGHT:\n return rotateY(value);\n default:\n return null;\n }\n }\n case PlaneView.FRONT: {\n switch (rotation.axis) {\n case Axis.TOP:\n return rotateY(value);\n case Axis.LEFT:\n return rotateX(value);\n case Axis.RIGHT:\n return rotateZ(value);\n default:\n return null;\n }\n }\n case PlaneView.SIDE: {\n switch (rotation.axis) {\n case Axis.TOP:\n return rotateY(value);\n case Axis.LEFT:\n return rotateZ(value);\n case Axis.RIGHT:\n return rotateX(-value);\n default:\n return null;\n }\n }\n default:\n return null;\n }\n};\nvar getViewMatrix = function (planeView, rotation) {\n var rotationMatrices = [];\n var rotationMatrix = rotation\n ? rotationToRotationMatrix(planeView, rotation)\n : null;\n if (rotationMatrix)\n rotationMatrices.push(rotationMatrix);\n switch (planeView) {\n case PlaneView.TOP: {\n return multiplyMatrices.apply(void 0, __spreadArray([topMatrix], rotationMatrices, false));\n }\n case PlaneView.FRONT: {\n return multiplyMatrices.apply(void 0, __spreadArray([frontMatrix], rotationMatrices, false));\n }\n case PlaneView.SIDE: {\n return multiplyMatrices.apply(void 0, __spreadArray([sideMatrix], rotationMatrices, false));\n }\n }\n return null;\n};\n\n;// ./src/@utils/svg.ts\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar svg_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\nvar addSVGProperties = function (svg, props) {\n Object.keys(props).forEach(function (prop) {\n svg.setAttributeNS(null, prop, props[prop]);\n });\n};\nvar getCommandsWithStart = function (commands) {\n return commands.length === 0 || commands[0].command === Command.move\n ? svg_spreadArray([], commands, true) : svg_spreadArray([\n {\n command: Command.move,\n point: { r: 0, l: 0, t: 0 }\n }\n ], commands, true);\n};\nvar getSVGPath = function (commands, centerX, centerY, scale, autoclose) {\n var drawCommands = getCommandsWithStart(commands);\n var svgPaths = drawCommands.map(function (c, index) {\n var point = getPointFromIsometricPoint(centerX, centerY, c.point, scale);\n switch (c.command) {\n case Command.move:\n return "M".concat(point.x, " ").concat(point.y);\n case Command.line:\n return "L".concat(point.x, " ").concat(point.y);\n case Command.curve: {\n var start = getPointFromIsometricPoint(centerX, centerY, commands[index - 1].point, scale);\n var control = getPointFromIsometricPoint(centerX, centerY, c.control, scale);\n var ellipsisSpecs = getEllipsisSpecs(start, point, control);\n var sweepFlag = getOrientation(start, control, point);\n return "A ".concat(ellipsisSpecs[0], " ").concat(ellipsisSpecs[1], " ").concat(ellipsisSpecs[2], " 0 ").concat(sweepFlag, " ").concat(point.x, " ").concat(point.y);\n }\n }\n });\n if (svgPaths.length) {\n var pathEnd = autoclose ? \'z\' : \'\';\n return "".concat(svgPaths.join(\' \').trim()).concat(pathEnd);\n }\n return \'\';\n};\nvar parseDrawCommands = function (commands) {\n var commandsArray = [];\n var array;\n while ((array = COMMANDS_REGEXP.exec(commands)) !== null) {\n var command = array[5] || array[1];\n switch (command) {\n case \'M\':\n commandsArray.push({\n command: Command.move,\n point: { r: +array[2], l: +array[3], t: +array[4] }\n });\n break;\n case \'L\':\n commandsArray.push({\n command: Command.line,\n point: { r: +array[2], l: +array[3], t: +array[4] }\n });\n break;\n case \'C\':\n commandsArray.push({\n command: Command.curve,\n control: { r: +array[6], l: +array[7], t: +array[8] },\n point: { r: +array[9], l: +array[10], t: +array[11] }\n });\n }\n }\n return commandsArray;\n};\nvar translateCommandPoints = function (commands, right, left, top) {\n commands.forEach(function (command) {\n command.point.r += right;\n command.point.l += left;\n command.point.t += top;\n if (command.control) {\n command.control.r += right;\n command.control.l += left;\n command.control.t += top;\n }\n });\n};\nvar getTextureCorner = function (commands, centerX, centerY, scale) {\n var corner = {\n x: Number.MAX_SAFE_INTEGER,\n y: Number.MAX_SAFE_INTEGER\n };\n getCommandsWithStart(commands)\n .forEach(function (c) {\n var point = getPointFromIsometricPoint(centerX, centerY, c.point, scale);\n if (point.x < corner.x ||\n (point.x === corner.x &&\n point.y < corner.y)) {\n corner.x = point.x;\n corner.y = point.y;\n }\n });\n return corner;\n};\nvar isSVGProperty = function (property) {\n return [\n \'fillColor\',\n \'fillOpacity\',\n \'strokeColor\',\n \'strokeOpacity\',\n \'strokeWidth\'\n ].includes(property);\n};\nvar getSVGProperty = function (property) {\n return {\n fillColor: \'fill\',\n fillOpacity: \'fill-opacity\',\n strokeColor: \'stroke\',\n strokeOpacity: \'stroke-opacity\',\n strokeWidth: \'stroke-width\'\n }[property];\n};\nfunction addEventListenerToElement(element, listeners, event, callback, useCapture) {\n var listener = {\n fn: callback,\n fnBind: callback.bind(this)\n };\n listeners.push(listener);\n element.addEventListener(event, listener.fnBind, useCapture);\n}\nfunction removeEventListenerFromElement(element, listeners, event, callback, useCapture) {\n var listener;\n listeners.find(function (ln, index) {\n if (ln.fn === callback) {\n listener = listeners.splice(index, 1)[0];\n return true;\n }\n });\n if (listener) {\n element.removeEventListener(event, listener.fnBind, useCapture);\n }\n}\nvar getPatternTransform = function (corner, planeView, scale, rotation) {\n var matrix = getViewMatrix(planeView, rotation);\n var transform = "translate(".concat(corner.x, " ").concat(corner.y, ")");\n if (matrix) {\n var m1 = round(matrix[0][0], DECIMALS);\n var m2 = round(matrix[1][0], DECIMALS);\n var m3 = round(matrix[0][1], DECIMALS);\n var m4 = round(matrix[1][1], DECIMALS);\n transform += " matrix(".concat(m1, ",").concat(m2, ",").concat(m3, ",").concat(m4, ",0,0)");\n transform += " scale(".concat(round(SCALE * (scale || 1), DECIMALS), ")");\n }\n else if (scale) {\n transform += " scale(".concat(round(scale, DECIMALS), ")");\n }\n return transform;\n};\nvar elementHasSVGParent = function (element) {\n if (element.parentNode) {\n if (element.parentNode.constructor.name === \'SVGSVGElement\') {\n return true;\n }\n return elementHasSVGParent(element.parentNode);\n }\n return false;\n};\nvar getAnimationProperties = function (getPath, animation, props) {\n var properties;\n var localGetPath = function (value) {\n var _a;\n if (props) {\n return getPath(__assign(__assign({}, props), (_a = {}, _a[animation.property] = +value, _a)));\n }\n return getPath(value);\n };\n if (animation.values) {\n if (Array.isArray(animation.values)) {\n properties = {\n values: animation.values.map(function (value) {\n return localGetPath(value);\n }).join(\';\')\n };\n }\n else {\n properties = {\n values: localGetPath(animation.values)\n };\n }\n }\n else {\n properties = {\n from: localGetPath(animation.from),\n to: localGetPath(animation.to)\n };\n }\n return properties;\n};\n\n;// ./src/@store/index.ts\nvar Store = (function () {\n function Store(width, height, scale) {\n this.sizes = {\n centerX: width / 2,\n centerY: height / 2,\n height: height,\n width: width,\n scale: scale\n };\n }\n Object.defineProperty(Store.prototype, "width", {\n get: function () {\n return this.sizes.width;\n },\n set: function (value) {\n this.sizes.width = value;\n this.sizes.centerX = value / 2;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "height", {\n get: function () {\n return this.sizes.height;\n },\n set: function (value) {\n this.sizes.height = value;\n this.sizes.centerY = value / 2;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "scale", {\n get: function () {\n return this.sizes.scale;\n },\n set: function (value) {\n this.sizes.scale = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "centerX", {\n get: function () {\n return this.sizes.centerX;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Store.prototype, "centerY", {\n get: function () {\n return this.sizes.centerY;\n },\n enumerable: false,\n configurable: true\n });\n return Store;\n}());\n\n\n;// ./src/@classes/abstract/IsometricStore/IsometricStore.ts\nvar IsometricStore = (function () {\n function IsometricStore() {\n }\n Object.defineProperty(IsometricStore.prototype, "data", {\n get: function () {\n return this.dataStore;\n },\n set: function (store) {\n this.dataStore = store;\n },\n enumerable: false,\n configurable: true\n });\n return IsometricStore;\n}());\n\n\n;// ./src/@classes/abstract/IsometricStore/index.ts\n\n\n;// ./src/@classes/abstract/IsometricElementAbstract/IsometricElementAbstract.ts\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar IsometricElementAbstract = (function (_super) {\n __extends(IsometricElementAbstract, _super);\n function IsometricElementAbstract(id, svgElement) {\n var _this = _super.call(this) || this;\n _this._id = id;\n _this.listeners = [];\n _this.element = document.createElementNS(SVG_NAMESPACE, svgElement);\n addSVGProperties(_this.element, {\n \'id\': _this._id\n });\n return _this;\n }\n IsometricElementAbstract.prototype.setId = function (value) {\n this._id = value;\n addSVGProperties(this.element, {\n \'id\': this._id\n });\n };\n IsometricElementAbstract.prototype.getElement = function () {\n return this.element;\n };\n IsometricElementAbstract.prototype.addEventListener = function (event, callback, useCapture) {\n if (useCapture === void 0) { useCapture = false; }\n addEventListenerToElement.call(this, this.element, this.listeners, event, callback, useCapture);\n return this;\n };\n IsometricElementAbstract.prototype.removeEventListener = function (event, callback, useCapture) {\n if (useCapture === void 0) { useCapture = false; }\n removeEventListenerFromElement(this.element, this.listeners, event, callback, useCapture);\n return this;\n };\n return IsometricElementAbstract;\n}(IsometricStore));\n\n\n;// ./src/@classes/abstract/IsometricElementAbstract/index.ts\n\n\n;// ./src/@classes/abstract/IsometricGraphicAbstract/IsometricGraphicAbstract.ts\nvar IsometricGraphicAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricGraphicAbstract_assign = (undefined && undefined.__assign) || function () {\n IsometricGraphicAbstract_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricGraphicAbstract_assign.apply(this, arguments);\n};\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\nvar defaultObjectProps = {\n fillColor: Colors.white,\n fillOpacity: 1,\n strokeColor: Colors.black,\n strokeDashArray: [],\n strokeLinecap: LineCap.butt,\n strokeLinejoin: LineJoin.round,\n strokeOpacity: 1,\n strokeWidth: 1\n};\nvar IsometricGraphicAbstract = (function (_super) {\n IsometricGraphicAbstract_extends(IsometricGraphicAbstract, _super);\n function IsometricGraphicAbstract(props, svgElement) {\n var _this = _super.call(this, props.id || uuid(), svgElement) || this;\n _this.props = IsometricGraphicAbstract_assign(IsometricGraphicAbstract_assign({}, defaultObjectProps), props);\n _this.animations = [];\n if (_this.props.texture) {\n _this.createTexture(_this.props.texture);\n }\n addSVGProperties(_this.element, IsometricGraphicAbstract_assign({ \'fill\': _this.props.texture\n ? "url(#".concat(_this.patternId, ") ").concat(_this.fillColor)\n : _this.fillColor, \'fill-opacity\': "".concat(_this.fillOpacity), \'stroke\': _this.strokeColor, \'stroke-dasharray\': _this.strokeDashArray.join(\' \'), \'stroke-linecap\': _this.strokeLinecap, \'stroke-linejoin\': _this.strokeLinejoin, \'stroke-opacity\': "".concat(_this.strokeOpacity), \'stroke-width\': "".concat(_this.strokeWidth) }, (_this.props.className && {\n class: _this.props.className\n })));\n return _this;\n }\n IsometricGraphicAbstract.prototype.createTexture = function (texture) {\n this.patternId = "".concat(this.id, "__texture");\n this.pattern = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.pattern);\n addSVGProperties(this.pattern, {\n \'id\': this.patternId,\n \'preserveAspectRatio\': \'none\',\n \'patternUnits\': \'userSpaceOnUse\'\n });\n var image = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.image);\n addSVGProperties(image, {\n \'href\': texture.url,\n \'x\': \'0\',\n \'y\': \'0\',\n \'preserveAspectRatio\': \'none\'\n });\n if (texture.pixelated) {\n addSVGProperties(image, {\n \'style\': \'image-rendering: pixelated\'\n });\n }\n this.pattern.appendChild(image);\n };\n IsometricGraphicAbstract.prototype._updateTexture = function () {\n var image = this.pattern.firstChild;\n if (this.props.texture.url &&\n image.getAttribute(\'href\') !== this.props.texture.url) {\n addSVGProperties(image, {\n \'href\': this.props.texture.url\n });\n }\n if (this.props.texture.pixelated) {\n addSVGProperties(image, {\n \'style\': \'image-rendering: pixelated\'\n });\n }\n else {\n image.removeAttribute(\'style\');\n }\n this.update();\n };\n IsometricGraphicAbstract.prototype.addAnimationBasicProperties = function (attributeName, animation) {\n addSVGProperties(animation.element, {\n repeatCount: "".concat(animation.repeat || \'indefinite\'),\n attributeName: attributeName,\n dur: "".concat(animation.duration || 1, "s")\n });\n };\n IsometricGraphicAbstract.prototype.updateAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (isNativeSVGProperty) {\n var property = getSVGProperty(animation.property);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(property, animation);\n var properties = getAnimationProperties(function (value) { return "".concat(value); }, animation);\n addSVGProperties(animation.element, properties);\n }\n });\n this.updateSubClassAnimations();\n };\n IsometricGraphicAbstract.prototype.updatePatternTransform = function (corner, planeView) {\n var _a, _b, _c;\n if (this.props.texture) {\n var height = this.props.texture.height\n ? "".concat(this.props.texture.height * this.data.scale)\n : \'100%\';\n var width = this.props.texture.width\n ? "".concat(this.props.texture.width * this.data.scale)\n : \'100%\';\n var shift = getPointFromIsometricPoint(0, 0, {\n r: ((_a = this.props.texture.shift) === null || _a === void 0 ? void 0 : _a.right) || 0,\n l: ((_b = this.props.texture.shift) === null || _b === void 0 ? void 0 : _b.left) || 0,\n t: ((_c = this.props.texture.shift) === null || _c === void 0 ? void 0 : _c.top) || 0\n }, this.data.scale);\n var transform = getPatternTransform({\n x: round(corner.x + shift.x, DECIMALS),\n y: round(corner.y + shift.y, DECIMALS)\n }, this.props.texture.planeView || planeView, this.props.texture.scale, this.props.texture.rotation);\n addSVGProperties(this.pattern, {\n \'patternTransform\': transform,\n \'height\': height,\n \'width\': width\n });\n addSVGProperties(this.pattern.firstChild, {\n \'height\': height,\n \'width\': width\n });\n }\n };\n Object.defineProperty(IsometricGraphicAbstract.prototype, "id", {\n get: function () {\n return this._id;\n },\n set: function (value) {\n this.setId(value);\n if (this.pattern) {\n this.patternId = "".concat(this.id, "__texture");\n addSVGProperties(this.pattern, {\n \'id\': this.patternId\n });\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "fillColor", {\n get: function () {\n return this.props.fillColor;\n },\n set: function (value) {\n this.props.fillColor = value;\n addSVGProperties(this.element, {\n \'fill\': this.props.texture\n ? "url(#".concat(this.patternId, ") ").concat(this.fillColor)\n : this.fillColor\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "fillOpacity", {\n get: function () {\n return this.props.fillOpacity;\n },\n set: function (value) {\n this.props.fillOpacity = value;\n addSVGProperties(this.element, { \'fill-opacity\': "".concat(this.fillOpacity) });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "texture", {\n get: function () {\n return this.props.texture;\n },\n set: function (value) {\n var hasTexture = !!this.props.texture;\n this.props.texture = value;\n if (hasTexture) {\n this._updateTexture();\n }\n else {\n this.createTexture(this.props.texture);\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeColor", {\n get: function () {\n return this.props.strokeColor;\n },\n set: function (value) {\n this.props.strokeColor = value;\n addSVGProperties(this.element, { \'stroke\': this.strokeColor });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeDashArray", {\n get: function () {\n return this.props.strokeDashArray;\n },\n set: function (value) {\n this.props.strokeDashArray = value;\n addSVGProperties(this.element, { \'stroke-dasharray\': this.strokeDashArray.join(\' \') });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeLinecap", {\n get: function () {\n return this.props.strokeLinecap;\n },\n set: function (value) {\n this.props.strokeLinecap = LineCap[value];\n addSVGProperties(this.element, { \'stroke-linecap\': this.strokeLinecap });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeLinejoin", {\n get: function () {\n return this.props.strokeLinejoin;\n },\n set: function (value) {\n this.props.strokeLinejoin = LineJoin[value];\n addSVGProperties(this.element, { \'stroke-linejoin\': this.strokeLinejoin });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeOpacity", {\n get: function () {\n return this.props.strokeOpacity;\n },\n set: function (value) {\n this.props.strokeOpacity = value;\n addSVGProperties(this.element, { \'stroke-opacity\': "".concat(this.strokeOpacity) });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "strokeWidth", {\n get: function () {\n return this.props.strokeWidth;\n },\n set: function (value) {\n this.props.strokeWidth = value;\n addSVGProperties(this.element, { \'stroke-width\': "".concat(this.strokeWidth) });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricGraphicAbstract.prototype, "className", {\n get: function () {\n return this.props.className;\n },\n set: function (value) {\n this.props.className = value;\n addSVGProperties(this.element, {\n \'class\': this.props.className\n });\n },\n enumerable: false,\n configurable: true\n });\n IsometricGraphicAbstract.prototype.getPattern = function () {\n return this.pattern;\n };\n IsometricGraphicAbstract.prototype.updateTexture = function (value) {\n var hasTexture = !!this.props.texture;\n if (hasTexture || value.url) {\n var shift = value.shift, rotation = value.rotation, newProps = __rest(value, ["shift", "rotation"]);\n this.props.texture = hasTexture\n ? IsometricGraphicAbstract_assign(IsometricGraphicAbstract_assign({}, this.props.texture), newProps) : IsometricGraphicAbstract_assign({}, newProps);\n if (shift) {\n this.props.texture.shift = IsometricGraphicAbstract_assign(IsometricGraphicAbstract_assign({}, (this.props.texture.shift || {})), shift);\n }\n if (rotation) {\n this.props.texture.rotation = rotation;\n }\n if (hasTexture) {\n this._updateTexture();\n }\n else {\n this.createTexture(this.props.texture);\n this.update();\n }\n }\n return this;\n };\n IsometricGraphicAbstract.prototype.addAnimation = function (animation) {\n this.animations.push(IsometricGraphicAbstract_assign({}, animation));\n this.update();\n return this;\n };\n IsometricGraphicAbstract.prototype.removeAnimationByIndex = function (index) {\n if (index >= 0 && index < this.animations.length) {\n var animation = this.animations.splice(index, 1)[0];\n if (animation.element && animation.element.parentNode) {\n animation.element.parentNode.removeChild(animation.element);\n }\n }\n return this;\n };\n IsometricGraphicAbstract.prototype.removeAnimations = function () {\n var animations = this.animations.splice(0);\n animations.forEach(function (animation) {\n if (animation.element && animation.element.parentNode) {\n animation.element.parentNode.removeChild(animation.element);\n }\n });\n return this;\n };\n return IsometricGraphicAbstract;\n}(IsometricElementAbstract));\n\n\n;// ./src/@classes/abstract/IsometricGraphicAbstract/index.ts\n\n\n;// ./src/@classes/abstract/IsometricContainerAbstract/IsometricContainerAbstract.ts\nvar IsometricContainerAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar IsometricContainerAbstract = (function (_super) {\n IsometricContainerAbstract_extends(IsometricContainerAbstract, _super);\n function IsometricContainerAbstract(id, svgElement) {\n var _this = _super.call(this, id, svgElement) || this;\n _this._children = [];\n return _this;\n }\n IsometricContainerAbstract.prototype.getChildIndex = function (child) {\n return this._children.indexOf(child);\n };\n IsometricContainerAbstract.prototype.throwChildError = function () {\n throw new Error(\'You cannot provide a child that is not a children of the container\');\n };\n IsometricContainerAbstract.prototype.removeSVGChild = function (child) {\n var svgChild = child.getElement();\n if (child instanceof IsometricGraphicAbstract) {\n var svgPatternChild = child.getPattern();\n if (svgPatternChild && svgPatternChild.parentNode) {\n this.element.removeChild(svgPatternChild);\n }\n }\n if (svgChild.parentNode) {\n this.element.removeChild(svgChild);\n }\n };\n IsometricContainerAbstract.prototype.insertPattern = function (pattern) {\n if (pattern) {\n this.element.insertBefore(pattern, this.element.firstChild);\n }\n };\n Object.defineProperty(IsometricContainerAbstract.prototype, "id", {\n get: function () {\n return this._id;\n },\n set: function (value) {\n this.setId(value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricContainerAbstract.prototype, "children", {\n get: function () {\n return this._children;\n },\n enumerable: false,\n configurable: true\n });\n IsometricContainerAbstract.prototype.update = function () {\n var _this = this;\n if (elementHasSVGParent(this.element)) {\n this._children.forEach(function (child) {\n child.data = _this.data;\n child.update();\n });\n }\n return this;\n };\n IsometricContainerAbstract.prototype.clear = function () {\n var _this = this;\n var children = this._children.splice(0);\n children.forEach(function (child) {\n _this.removeSVGChild(child);\n });\n return this;\n };\n IsometricContainerAbstract.prototype.addChild = function (child) {\n child.data = this.data;\n this._children.push(child);\n if (child instanceof IsometricGraphicAbstract) {\n this.insertPattern(child.getPattern());\n }\n this.element.appendChild(child.getElement());\n child.update();\n return this;\n };\n IsometricContainerAbstract.prototype.addChildren = function () {\n var _this = this;\n var children = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n children[_i] = arguments[_i];\n }\n children.forEach(function (child) { return _this.addChild(child); });\n return this;\n };\n IsometricContainerAbstract.prototype.getChildByIndex = function (index) {\n return this._children[index] || null;\n };\n IsometricContainerAbstract.prototype.getChildById = function (id) {\n var child = this._children.find(function (child) { return child.id === id; });\n return child || null;\n };\n IsometricContainerAbstract.prototype.removeChild = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n this._children.splice(childIndex, 1);\n this.removeSVGChild(child);\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.removeChildren = function () {\n var _this = this;\n var children = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n children[_i] = arguments[_i];\n }\n children.forEach(function (child) {\n var childIndex = _this.getChildIndex(child);\n if (childIndex === -1) {\n _this.throwChildError();\n }\n _this.removeChild(child);\n });\n return this;\n };\n IsometricContainerAbstract.prototype.removeChildByIndex = function (index) {\n if (index >= 0 && index < this._children.length) {\n var child = this._children.splice(index, 1)[0];\n this.removeSVGChild(child);\n }\n return this;\n };\n IsometricContainerAbstract.prototype.removeChildById = function (id) {\n var child = this.getChildById(id);\n if (child) {\n return this.removeChild(child);\n }\n };\n IsometricContainerAbstract.prototype.setChildIndex = function (child, index) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n index = Math.min(Math.max(0, index), this._children.length - 1);\n var movedElement = child.getElement();\n var replacedElement = this._children[index].getElement();\n if (this._children[index] !== child) {\n this._children.splice(childIndex, 1);\n this._children.splice(index, 0, child);\n if (childIndex > index) {\n this.element.insertBefore(movedElement, replacedElement);\n }\n else {\n if (replacedElement.nextSibling) {\n this.element.insertBefore(movedElement, replacedElement.nextSibling);\n }\n else {\n this.element.appendChild(movedElement);\n }\n }\n }\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.bringChildToFront = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n this.setChildIndex(child, this._children.length - 1);\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.bringChildForward = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n if (childIndex < this._children.length - 1) {\n this.setChildIndex(child, childIndex + 1);\n }\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.sendChildToBack = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n this.setChildIndex(child, 0);\n return this;\n }\n this.throwChildError();\n };\n IsometricContainerAbstract.prototype.sendChildBackward = function (child) {\n var childIndex = this.getChildIndex(child);\n if (childIndex > -1) {\n if (childIndex > 0) {\n this.setChildIndex(child, childIndex - 1);\n }\n return this;\n }\n this.throwChildError();\n };\n return IsometricContainerAbstract;\n}(IsometricElementAbstract));\n\n\n;// ./src/@classes/abstract/IsometricContainerAbstract/index.ts\n\n\n;// ./src/@classes/public/IsometricCanvas/IsometricCanvas.ts\nvar IsometricCanvas_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricCanvas_assign = (undefined && undefined.__assign) || function () {\n IsometricCanvas_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricCanvas_assign.apply(this, arguments);\n};\n\n\n\n\n\nvar defaultProps = {\n container: \'body\',\n backgroundColor: Colors.white,\n scale: 1,\n height: DEFAULT_HEIGHT,\n width: DEFAULT_WIDTH\n};\nvar IsometricCanvas = (function (_super) {\n IsometricCanvas_extends(IsometricCanvas, _super);\n function IsometricCanvas(props) {\n var _a;\n if (props === void 0) { props = {}; }\n var _this = _super.call(this, props.id || uuid(), SVG_ELEMENTS.svg) || this;\n _this.props = IsometricCanvas_assign(IsometricCanvas_assign({}, defaultProps), props);\n _this.isAnimated = true;\n _this.data = new Store(_this.props.width, _this.props.height, _this.props.scale);\n addSVGProperties(_this.element, (_a = {},\n _a[SVG_PROPERTIES.viewBox] = "0 0 ".concat(_this.data.width, " ").concat(_this.data.height),\n _a.width = "".concat(_this.data.width, "px"),\n _a.height = "".concat(_this.data.height, "px"),\n _a));\n _this.background = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.rect);\n addSVGProperties(_this.background, {\n fill: _this.backgroundColor,\n x: \'0\',\n y: \'0\',\n width: "".concat(_this.data.width, "px"),\n height: "".concat(_this.data.height, "px")\n });\n _this.element.appendChild(_this.background);\n var containerElement = typeof _this.props.container === \'string\'\n ? document.querySelector(_this.props.container)\n : _this.props.container;\n containerElement.appendChild(_this.element);\n return _this;\n }\n Object.defineProperty(IsometricCanvas.prototype, "backgroundColor", {\n get: function () {\n return this.props.backgroundColor;\n },\n set: function (value) {\n this.props.backgroundColor = value;\n addSVGProperties(this.background, { fill: this.backgroundColor });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "scale", {\n get: function () {\n return this.data.scale;\n },\n set: function (value) {\n this.data.scale = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "height", {\n get: function () {\n return this.data.height;\n },\n set: function (value) {\n var _a;\n this.data.height = value;\n addSVGProperties(this.element, (_a = {},\n _a[SVG_PROPERTIES.viewBox] = "0 0 ".concat(this.data.width, " ").concat(this.data.height),\n _a.height = "".concat(this.data.height, "px"),\n _a));\n addSVGProperties(this.background, {\n height: "".concat(this.data.height, "px")\n });\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "width", {\n get: function () {\n return this.data.width;\n },\n set: function (value) {\n var _a;\n this.data.width = value;\n addSVGProperties(this.element, (_a = {},\n _a[SVG_PROPERTIES.viewBox] = "0 0 ".concat(this.data.width, " ").concat(this.data.height),\n _a.width = "".concat(this.data.width, "px"),\n _a));\n addSVGProperties(this.background, {\n width: "".concat(this.data.width, "px")\n });\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricCanvas.prototype, "animated", {\n get: function () {\n return this.isAnimated;\n },\n enumerable: false,\n configurable: true\n });\n IsometricCanvas.prototype.getSVGCode = function () {\n return this.element.outerHTML;\n };\n IsometricCanvas.prototype.pauseAnimations = function () {\n var svg = this.element;\n if (typeof svg.pauseAnimations === \'function\') {\n svg.pauseAnimations();\n }\n this.isAnimated = false;\n return this;\n };\n IsometricCanvas.prototype.resumeAnimations = function () {\n var svg = this.element;\n if (typeof svg.unpauseAnimations === \'function\') {\n svg.unpauseAnimations();\n }\n this.isAnimated = true;\n return this;\n };\n return IsometricCanvas;\n}(IsometricContainerAbstract));\n\n\n;// ./src/@classes/public/IsometricCanvas/index.ts\n\n\n\n;// ./src/@utils/other.ts\nvar applyMixins = function (BaseClass, constructor) {\n Object.getOwnPropertyNames(constructor.prototype).forEach(function (name) {\n Object.defineProperty(BaseClass.prototype, name, Object.getOwnPropertyDescriptor(constructor.prototype, name));\n });\n};\n\n;// ./src/@classes/abstract/IsometricDraggableAbstract/constants.ts\nvar NO_LIMITS = [\n Number.MIN_SAFE_INTEGER,\n Number.MAX_SAFE_INTEGER\n];\nvar DRAG_EVENT;\n(function (DRAG_EVENT) {\n DRAG_EVENT["DRAG_START"] = "dragstart";\n DRAG_EVENT["DRAG"] = "drag";\n DRAG_EVENT["DRAG_END"] = "dragend";\n})(DRAG_EVENT || (DRAG_EVENT = {}));\n\n;// ./src/@classes/abstract/IsometricDraggableAbstract/IsometricDraggableAbstract.ts\nvar IsometricDraggableAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricDraggableAbstract_assign = (undefined && undefined.__assign) || function () {\n IsometricDraggableAbstract_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricDraggableAbstract_assign.apply(this, arguments);\n};\nvar IsometricDraggableAbstract_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\nvar _isBrowser = typeof window !== Typeof.UNDEFINED;\nvar _requestAnimationFrame = _isBrowser\n ? (window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.msRequestAnimationFrame)\n : null;\nvar _dragStoreDefault = {\n right: 0,\n left: 0,\n top: 0,\n x: 0,\n y: 0\n};\nvar isMouseEvent = function (event) { return \'clientX\' in event; };\nvar getClientCoords = function (event) {\n if (event instanceof Event) {\n if (isMouseEvent(event)) {\n return {\n clientX: event.clientX,\n clientY: event.clientY\n };\n }\n return {\n clientX: event.touches[0].clientX,\n clientY: event.touches[0].clientY\n };\n }\n return event;\n};\nvar IsometricDraggableAbstract = (function (_super) {\n IsometricDraggableAbstract_extends(IsometricDraggableAbstract, _super);\n function IsometricDraggableAbstract() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n IsometricDraggableAbstract.prototype.setup = function () {\n this.startDrag = this.startDrag.bind(this);\n this.stopDrag = this.stopDrag.bind(this);\n this.moveElement = this.moveElement.bind(this);\n this.dropElement = this.dropElement.bind(this);\n this.animate = this.animate.bind(this);\n if (typeof this._bounds === Typeof.UNDEFINED) {\n this._bounds = false;\n }\n if (typeof this._dragStore === Typeof.UNDEFINED) {\n this._dragStore = _dragStoreDefault;\n }\n if (typeof this._coords === Typeof.UNDEFINED) {\n this._coords = {};\n }\n };\n IsometricDraggableAbstract.prototype.betweenBounds = function (value, bounds) {\n var orderedBounds = IsometricDraggableAbstract_spreadArray([], bounds, true).sort();\n return round(Math.min(Math.max(value, orderedBounds[0]), orderedBounds[1]), DECIMALS);\n };\n IsometricDraggableAbstract.prototype.getBoundOrMaximum = function (prop) {\n var _a;\n if (this.bounds) {\n return (_a = this.bounds[prop]) !== null && _a !== void 0 ? _a : IsometricDraggableAbstract_spreadArray([], NO_LIMITS, true);\n }\n return IsometricDraggableAbstract_spreadArray([], NO_LIMITS, true);\n };\n IsometricDraggableAbstract.prototype.getRight = function (value) {\n var bounds = this.getBoundOrMaximum(\'right\');\n return this.betweenBounds(this._dragStore.right + value / this.data.scale, bounds);\n };\n IsometricDraggableAbstract.prototype.getLeft = function (value) {\n var bounds = this.getBoundOrMaximum(\'left\');\n return this.betweenBounds(this._dragStore.left + value / this.data.scale, bounds);\n };\n IsometricDraggableAbstract.prototype.getTop = function (value) {\n var bounds = this.getBoundOrMaximum(\'top\');\n return this.betweenBounds(this._dragStore.top + value / this.data.scale, bounds);\n };\n IsometricDraggableAbstract.prototype.getFixedCoordinates = function (coords) {\n var _this = this;\n return Object.entries(coords).reduce(function (acc, entry) {\n var fixedCoords = IsometricDraggableAbstract_assign({}, acc);\n switch (entry[0]) {\n case \'right\':\n fixedCoords.right = _this.getRight(entry[1]);\n break;\n case \'left\':\n fixedCoords.left = _this.getLeft(entry[1]);\n break;\n default:\n fixedCoords.top = _this.getTop(entry[1]);\n }\n return fixedCoords;\n }, {});\n };\n IsometricDraggableAbstract.prototype.dispatchEvent = function (eventType) {\n var _a, _b, _c;\n var dragEvent = new CustomEvent(eventType, {\n cancelable: eventType === DRAG_EVENT.DRAG,\n detail: {\n right: (_a = this._coords.right) !== null && _a !== void 0 ? _a : this.right,\n left: (_b = this._coords.left) !== null && _b !== void 0 ? _b : this.left,\n top: (_c = this._coords.top) !== null && _c !== void 0 ? _c : this.top\n }\n });\n this.element.dispatchEvent(dragEvent);\n return dragEvent;\n };\n IsometricDraggableAbstract.prototype.animate = function () {\n if (this._update) {\n if (!this._prevented) {\n if (typeof this._coords.right === Typeof.NUMBER) {\n this.right = this._coords.right;\n }\n if (typeof this._coords.left === Typeof.NUMBER) {\n this.left = this._coords.left;\n }\n if (typeof this._coords.top === Typeof.NUMBER) {\n this.top = this._coords.top;\n }\n }\n _requestAnimationFrame(this.animate);\n }\n };\n IsometricDraggableAbstract.prototype.startDrag = function (event) {\n event.preventDefault();\n var _a = getClientCoords(event), clientX = _a.clientX, clientY = _a.clientY;\n this._dragStore.x = clientX;\n this._dragStore.y = clientY;\n this._dragStore.right = this.right;\n this._dragStore.left = this.left;\n this._dragStore.top = this.top;\n this._update = true;\n this.moveElement({ clientX: clientX, clientY: clientY });\n this.element.addEventListener(EVENTS.TOUCH_MOVE, this.moveElement, true);\n this.element.addEventListener(EVENTS.TOUCH_END, this.dropElement, true);\n document.addEventListener(EVENTS.MOUSE_MOVE, this.moveElement, true);\n document.addEventListener(EVENTS.MOUSE_UP, this.dropElement, true);\n _requestAnimationFrame(this.animate);\n };\n IsometricDraggableAbstract.prototype.moveElement = function (event) {\n var _a = getClientCoords(event), clientX = _a.clientX, clientY = _a.clientY;\n var diffX = clientX - this._dragStore.x;\n var diffY = clientY - this._dragStore.y;\n if (this._drag === PlaneView.TOP) {\n this._coords = this.getFixedCoordinates(getTopPlanePointFromCoordinates(diffX, diffY));\n }\n else if (this._drag === PlaneView.FRONT) {\n this._coords = this.getFixedCoordinates(getFrontPlanePointFromCoordinates(diffX, diffY));\n }\n else {\n this._coords = this.getFixedCoordinates(getSidePlanePointFromCoordinates(diffX, diffY));\n }\n var dragEvent;\n if (event instanceof Event) {\n event.preventDefault();\n if (!this._dragging) {\n this.dispatchEvent(DRAG_EVENT.DRAG_START);\n }\n this._dragging = true;\n dragEvent = this.dispatchEvent(DRAG_EVENT.DRAG);\n }\n this._prevented = !!(dragEvent && dragEvent.defaultPrevented);\n };\n IsometricDraggableAbstract.prototype.dropElement = function () {\n this._update = false;\n this._dragging = false;\n this.element.removeEventListener(EVENTS.TOUCH_MOVE, this.moveElement, true);\n this.element.removeEventListener(EVENTS.TOUCH_END, this.dropElement, true);\n document.removeEventListener(EVENTS.MOUSE_MOVE, this.moveElement, true);\n document.removeEventListener(EVENTS.MOUSE_UP, this.dropElement, true);\n this.dispatchEvent(DRAG_EVENT.DRAG_END);\n };\n IsometricDraggableAbstract.prototype.beginDrag = function () {\n this.element.addEventListener(EVENTS.TOUCH_START, this.startDrag, true);\n this.element.addEventListener(EVENTS.MOUSE_DOWN, this.startDrag, true);\n };\n IsometricDraggableAbstract.prototype.stopDrag = function () {\n this.element.removeEventListener(EVENTS.TOUCH_START, this.startDrag, true);\n this.element.removeEventListener(EVENTS.TOUCH_MOVE, this.moveElement, true);\n this.element.removeEventListener(EVENTS.TOUCH_END, this.dropElement, true);\n this.element.removeEventListener(EVENTS.MOUSE_DOWN, this.startDrag, true);\n document.removeEventListener(EVENTS.MOUSE_MOVE, this.moveElement, true);\n document.removeEventListener(EVENTS.MOUSE_UP, this.dropElement, true);\n };\n Object.defineProperty(IsometricDraggableAbstract.prototype, "right", {\n get: function () {\n return this.props.right;\n },\n set: function (value) {\n if (this.props.right !== value) {\n this.props.right = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "left", {\n get: function () {\n return this.props.left;\n },\n set: function (value) {\n if (this.props.left !== value) {\n this.props.left = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "top", {\n get: function () {\n return this.props.top;\n },\n set: function (value) {\n if (this.props.top !== value) {\n this.props.top = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "drag", {\n get: function () {\n return this._drag || false;\n },\n set: function (value) {\n if (typeof this._drag === Typeof.UNDEFINED) {\n this.setup();\n }\n this._drag = value;\n if (_isBrowser) {\n this.stopDrag();\n this.beginDrag();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricDraggableAbstract.prototype, "bounds", {\n get: function () {\n return this._bounds || false;\n },\n set: function (value) {\n this._bounds = value;\n var boundsRight = this.getBoundOrMaximum(\'right\');\n var boundsLeft = this.getBoundOrMaximum(\'left\');\n var boundsTop = this.getBoundOrMaximum(\'top\');\n this.right = this.betweenBounds(this.right, boundsRight);\n this.left = this.betweenBounds(this.left, boundsLeft);\n this.top = this.betweenBounds(this.top, boundsTop);\n },\n enumerable: false,\n configurable: true\n });\n return IsometricDraggableAbstract;\n}(IsometricElementAbstract));\n\n\n;// ./src/@classes/abstract/IsometricDraggableAbstract/index.ts\n\n\n;// ./src/@classes/public/IsometricGroup/IsometricGroup.ts\nvar IsometricGroup_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricGroup_assign = (undefined && undefined.__assign) || function () {\n IsometricGroup_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricGroup_assign.apply(this, arguments);\n};\n\n\n\n\n\n\nvar IsometricGroup_defaultProps = {\n right: 0,\n left: 0,\n top: 0,\n};\nvar IsometricGroup = (function (_super) {\n IsometricGroup_extends(IsometricGroup, _super);\n function IsometricGroup(props) {\n if (props === void 0) { props = {}; }\n var _this = _super.call(this, props.id || uuid(), SVG_ELEMENTS.group) || this;\n _this.props = IsometricGroup_assign(IsometricGroup_assign({}, IsometricGroup_defaultProps), props);\n return _this;\n }\n IsometricGroup.prototype.update = function () {\n if (elementHasSVGParent(this.element)) {\n var point = getPointFromIsometricPoint(0, 0, {\n r: this.props.right,\n l: this.props.left,\n t: this.props.top\n }, this.data.scale);\n addSVGProperties(this.element, {\n transform: "translate(".concat(point.x, ", ").concat(point.y, ")")\n });\n }\n return _super.prototype.update.call(this);\n };\n return IsometricGroup;\n}(IsometricContainerAbstract));\n\napplyMixins(IsometricGroup, IsometricDraggableAbstract);\n\n;// ./src/@classes/public/IsometricGroup/index.ts\n\n\n;// ./src/@classes/abstract/IsometricPathAbstract/IsometricPathAbstract.ts\nvar IsometricPathAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar IsometricPathAbstract = (function (_super) {\n IsometricPathAbstract_extends(IsometricPathAbstract, _super);\n function IsometricPathAbstract(props, svgElement) {\n return _super.call(this, props, svgElement) || this;\n }\n IsometricPathAbstract.prototype.updateGraphic = function (planeView, autoclose) {\n if (autoclose === void 0) { autoclose = true; }\n if (elementHasSVGParent(this.element)) {\n var commands = this.getCommands();\n var corner = getTextureCorner(commands, this.data.centerX, this.data.centerY, this.data.scale);\n addSVGProperties(this.element, {\n d: getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, autoclose)\n });\n this.updatePatternTransform(corner, planeView);\n this.updateAnimations();\n }\n };\n return IsometricPathAbstract;\n}(IsometricGraphicAbstract));\n\n\n;// ./src/@classes/abstract/IsometricPathAbstract/index.ts\n\n\n;// ./src/@classes/abstract/IsometricShapeAbstract/IsometricShapeAbstract.ts\nvar IsometricShapeAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricShapeAbstract_assign = (undefined && undefined.__assign) || function () {\n IsometricShapeAbstract_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricShapeAbstract_assign.apply(this, arguments);\n};\n\n\n\n\n\nvar IsometricShapeAbstract_defaultProps = {\n right: 0,\n left: 0,\n top: 0,\n};\nvar IsometricShapeAbstract = (function (_super) {\n IsometricShapeAbstract_extends(IsometricShapeAbstract, _super);\n function IsometricShapeAbstract(props) {\n return _super.call(this, IsometricShapeAbstract_assign(IsometricShapeAbstract_assign({}, IsometricShapeAbstract_defaultProps), props), SVG_ELEMENTS.path) || this;\n }\n IsometricShapeAbstract.prototype.update = function () {\n this.updateGraphic(this.planeView);\n return this;\n };\n IsometricShapeAbstract.prototype.clear = function () {\n addSVGProperties(this.element, {\n d: \'\'\n });\n return this;\n };\n Object.defineProperty(IsometricShapeAbstract.prototype, "planeView", {\n get: function () {\n return this.props.planeView;\n },\n set: function (value) {\n this.props.planeView = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n return IsometricShapeAbstract;\n}(IsometricPathAbstract));\n\napplyMixins(IsometricShapeAbstract, IsometricDraggableAbstract);\n\n;// ./src/@classes/abstract/IsometricShapeAbstract/index.ts\n\n\n;// ./src/@classes/public/IsometricRectangle/IsometricRectangle.ts\nvar IsometricRectangle_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricRectangle_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\nvar IsometricRectangle = (function (_super) {\n IsometricRectangle_extends(IsometricRectangle, _super);\n function IsometricRectangle(props) {\n var _this = this;\n var height = props.height, width = props.width, rest = IsometricRectangle_rest(props, ["height", "width"]);\n _this = _super.call(this, rest) || this;\n _this._width = width;\n _this._height = height;\n return _this;\n }\n IsometricRectangle.prototype.getCommands = function (args) {\n var _a, _b, _c, _d, _e;\n var right = (_a = args === null || args === void 0 ? void 0 : args.right) !== null && _a !== void 0 ? _a : this.right;\n var left = (_b = args === null || args === void 0 ? void 0 : args.left) !== null && _b !== void 0 ? _b : this.left;\n var top = (_c = args === null || args === void 0 ? void 0 : args.top) !== null && _c !== void 0 ? _c : this.top;\n var width = (_d = args === null || args === void 0 ? void 0 : args.width) !== null && _d !== void 0 ? _d : this.width;\n var height = (_e = args === null || args === void 0 ? void 0 : args.height) !== null && _e !== void 0 ? _e : this.height;\n var commands = [{ command: Command.move, point: { r: 0, l: 0, t: 0 } }];\n switch (this.planeView) {\n case PlaneView.FRONT:\n commands.push({ command: Command.line, point: { r: 0, l: width, t: 0 } }, { command: Command.line, point: { r: 0, l: width, t: height } }, { command: Command.line, point: { r: 0, l: 0, t: height } });\n break;\n case PlaneView.SIDE:\n commands.push({ command: Command.line, point: { r: width, l: 0, t: 0 } }, { command: Command.line, point: { r: width, l: 0, t: height } }, { command: Command.line, point: { r: 0, l: 0, t: height } });\n break;\n case PlaneView.TOP:\n commands.push({ command: Command.line, point: { r: width, l: 0, t: 0 } }, { command: Command.line, point: { r: width, l: height, t: 0 } }, { command: Command.line, point: { r: 0, l: height, t: 0 } });\n break;\n }\n translateCommandPoints(commands, right, left, top);\n return commands;\n };\n IsometricRectangle.prototype.getRectanglePath = function (args) {\n var commands = this.getCommands(args);\n return getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, true);\n };\n IsometricRectangle.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n var props = {\n right: _this.right,\n left: _this.left,\n top: _this.top,\n width: _this.width,\n height: _this.height\n };\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var properties = getAnimationProperties(_this.getRectanglePath.bind(_this), animation, props);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n }\n });\n };\n Object.defineProperty(IsometricRectangle.prototype, "width", {\n get: function () {\n return this._width;\n },\n set: function (value) {\n this._width = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricRectangle.prototype, "height", {\n get: function () {\n return this._height;\n },\n set: function (value) {\n this._height = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricRectangle.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricRectangle;\n}(IsometricShapeAbstract));\n\n\n;// ./src/@classes/public/IsometricRectangle/index.ts\n\n\n;// ./src/@classes/public/IsometricCircle/IsometricCircle.ts\nvar IsometricCircle_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricCircle_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\nvar IsometricCircle = (function (_super) {\n IsometricCircle_extends(IsometricCircle, _super);\n function IsometricCircle(props) {\n var _this = this;\n var radius = props.radius, rest = IsometricCircle_rest(props, ["radius"]);\n _this = _super.call(this, rest) || this;\n _this._radius = radius;\n return _this;\n }\n IsometricCircle.prototype.getCommands = function (args) {\n var _a, _b, _c, _d;\n var right = (_a = args === null || args === void 0 ? void 0 : args.right) !== null && _a !== void 0 ? _a : this.right;\n var left = (_b = args === null || args === void 0 ? void 0 : args.left) !== null && _b !== void 0 ? _b : this.left;\n var top = (_c = args === null || args === void 0 ? void 0 : args.top) !== null && _c !== void 0 ? _c : this.top;\n var radius = (_d = args === null || args === void 0 ? void 0 : args.radius) !== null && _d !== void 0 ? _d : this.radius;\n var commands = [];\n switch (this.planeView) {\n case PlaneView.FRONT:\n commands.push({\n command: Command.move,\n point: { r: 0, l: radius, t: 0 }\n }, {\n command: Command.curve,\n point: { r: 0, l: -radius, t: 0 },\n control: { r: 0, l: 0, t: -radius }\n }, {\n command: Command.curve,\n point: { r: 0, l: radius, t: 0 },\n control: { r: 0, l: 0, t: radius }\n });\n break;\n case PlaneView.SIDE:\n commands.push({\n command: Command.move,\n point: { r: -radius, l: 0, t: 0 }\n }, {\n command: Command.curve,\n point: { r: radius, l: 0, t: 0 },\n control: { r: 0, l: 0, t: -radius }\n }, {\n command: Command.curve,\n point: { r: -radius, l: 0, t: 0 },\n control: { r: 0, l: 0, t: radius }\n });\n break;\n case PlaneView.TOP:\n commands.push({\n command: Command.move,\n point: { r: 0, l: radius, t: 0 }\n }, {\n command: Command.curve,\n point: { r: 0, l: -radius, t: 0 },\n control: { r: radius, l: 0, t: 0 }\n }, {\n command: Command.curve,\n point: { r: 0, l: radius, t: 0 },\n control: { r: -radius, l: 0, t: 0 }\n });\n break;\n }\n translateCommandPoints(commands, right, left, top);\n return commands;\n };\n IsometricCircle.prototype.getCirclePath = function (args) {\n var commands = this.getCommands(args);\n return getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, true);\n };\n IsometricCircle.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n var props = {\n right: _this.right,\n left: _this.left,\n top: _this.top,\n radius: _this.radius\n };\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var properties = getAnimationProperties(_this.getCirclePath.bind(_this), animation, props);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n }\n });\n };\n Object.defineProperty(IsometricCircle.prototype, "radius", {\n get: function () {\n return this._radius;\n },\n set: function (value) {\n this._radius = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricCircle.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricCircle;\n}(IsometricShapeAbstract));\n\n\n;// ./src/@classes/public/IsometricCircle/index.ts\n\n\n;// ./src/@classes/abstract/IsometricStarPolygonAbstract/IsometricStarPolygonAbstract.ts\nvar IsometricStarPolygonAbstract_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricStarPolygonAbstract_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar IsometricStarPolygonAbstract_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\nvar IsometricStarPolygonAbstract = (function (_super) {\n IsometricStarPolygonAbstract_extends(IsometricStarPolygonAbstract, _super);\n function IsometricStarPolygonAbstract(props) {\n var _this = this;\n var radius = props.radius, points = props.points, density = props.density, _a = props.rotation, rotation = _a === void 0 ? 0 : _a, rest = IsometricStarPolygonAbstract_rest(props, ["radius", "points", "density", "rotation"]);\n _this = _super.call(this, rest) || this;\n _this._radius = radius;\n _this._points = points;\n _this._density = density;\n _this._rotation = rotation;\n _this._sector = 2 * Math.PI / _this._points;\n _this._halfSector = _this._sector / 2;\n return _this;\n }\n IsometricStarPolygonAbstract.prototype.getCommands = function (args) {\n var _a, _b, _c, _d, _e, _f, _g;\n var right = (_a = args === null || args === void 0 ? void 0 : args.right) !== null && _a !== void 0 ? _a : this.right;\n var left = (_b = args === null || args === void 0 ? void 0 : args.left) !== null && _b !== void 0 ? _b : this.left;\n var top = (_c = args === null || args === void 0 ? void 0 : args.top) !== null && _c !== void 0 ? _c : this.top;\n var radius = (_d = args === null || args === void 0 ? void 0 : args.radius) !== null && _d !== void 0 ? _d : this.radius;\n var points = (_e = args === null || args === void 0 ? void 0 : args.points) !== null && _e !== void 0 ? _e : this._points;\n var density = (_f = args === null || args === void 0 ? void 0 : args.density) !== null && _f !== void 0 ? _f : this._density;\n var rotation = (_g = args === null || args === void 0 ? void 0 : args.rotation) !== null && _g !== void 0 ? _g : this.rotation;\n var coordinates = this.get2DCoordinates(radius, points, density, rotation);\n var commands = [];\n switch (this.planeView) {\n case PlaneView.FRONT:\n coordinates.forEach(function (point, index) {\n commands.push({\n command: index === 0\n ? Command.move\n : Command.line,\n point: {\n r: 0,\n l: point.x,\n t: point.y\n }\n });\n });\n break;\n case PlaneView.SIDE:\n coordinates.forEach(function (point, index) {\n commands.push({\n command: index === 0\n ? Command.move\n : Command.line,\n point: {\n r: point.x,\n l: 0,\n t: point.y\n }\n });\n });\n break;\n case PlaneView.TOP:\n coordinates.forEach(function (point, index) {\n commands.push({\n command: index === 0\n ? Command.move\n : Command.line,\n point: {\n r: -point.x,\n l: -point.y,\n t: 0\n }\n });\n });\n break;\n }\n translateCommandPoints(commands, right, left, top);\n return commands;\n };\n IsometricStarPolygonAbstract.prototype._getRadianAngle = function (angle) {\n return angle * Math.PI / 180;\n };\n IsometricStarPolygonAbstract.prototype._getInnerRadius = function (radius, points, density) {\n return radius * Math.cos(Math.PI * density / points) / Math.cos(Math.PI * (density - 1) / points);\n };\n IsometricStarPolygonAbstract.prototype.get2DCoordinates = function (radius, points, density, rotation) {\n var _this = this;\n var innerRadius = this._getInnerRadius(radius, points, density);\n return IsometricStarPolygonAbstract_spreadArray([], Array(this._points), true).reduce(function (points, _undefined, index) {\n var angle = index * _this._sector + 2 * Math.PI - _this._getRadianAngle(rotation);\n var innerAngle = angle + _this._halfSector;\n var oX = Math.sin(angle) * radius;\n var oY = Math.cos(angle) * radius;\n var iX = Math.sin(innerAngle) * innerRadius;\n var iY = Math.cos(innerAngle) * innerRadius;\n return IsometricStarPolygonAbstract_spreadArray(IsometricStarPolygonAbstract_spreadArray([], points, true), [\n { x: oX, y: oY },\n { x: iX, y: iY }\n ], false);\n }, []);\n };\n IsometricStarPolygonAbstract.prototype.getPentagramPath = function (args) {\n var commands = this.getCommands(args);\n return getSVGPath(commands, this.data.centerX, this.data.centerY, this.data.scale, true);\n };\n IsometricStarPolygonAbstract.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n var props = {\n right: _this.right,\n left: _this.left,\n top: _this.top,\n radius: _this.radius,\n points: _this._points,\n density: _this._density,\n rotation: _this.rotation\n };\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var properties = getAnimationProperties(_this.getPentagramPath.bind(_this), animation, props);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n }\n });\n };\n Object.defineProperty(IsometricStarPolygonAbstract.prototype, "radius", {\n get: function () {\n return this._radius;\n },\n set: function (value) {\n this._radius = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricStarPolygonAbstract.prototype, "rotation", {\n get: function () {\n return this._rotation;\n },\n set: function (value) {\n this._rotation = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricStarPolygonAbstract.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricStarPolygonAbstract;\n}(IsometricShapeAbstract));\n\n\n;// ./src/@classes/abstract/IsometricStarPolygonAbstract/index.ts\n\n\n\n;// ./src/@classes/public/IsometricPentagram/IsometricPentagram.ts\nvar IsometricPentagram_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricPentagram_assign = (undefined && undefined.__assign) || function () {\n IsometricPentagram_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricPentagram_assign.apply(this, arguments);\n};\n\nvar IsometricPentagram = (function (_super) {\n IsometricPentagram_extends(IsometricPentagram, _super);\n function IsometricPentagram(props) {\n return _super.call(this, IsometricPentagram_assign(IsometricPentagram_assign({}, props), { points: 5, density: 2 })) || this;\n }\n return IsometricPentagram;\n}(IsometricStarPolygonAbstract));\n\n\n;// ./src/@classes/public/IsometricPentagram/index.ts\n\n\n;// ./src/@classes/public/IsometricStarPolygon/IsometricStarPolygon.ts\nvar IsometricStarPolygon_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\nvar IsometricStarPolygon = (function (_super) {\n IsometricStarPolygon_extends(IsometricStarPolygon, _super);\n function IsometricStarPolygon(props) {\n return _super.call(this, props) || this;\n }\n Object.defineProperty(IsometricStarPolygon.prototype, "points", {\n get: function () {\n return this._points;\n },\n set: function (value) {\n this._points = value;\n this._sector = 2 * Math.PI / this._points;\n this._halfSector = this._sector / 2;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricStarPolygon.prototype, "density", {\n get: function () {\n return this._density;\n },\n set: function (value) {\n this._density = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n return IsometricStarPolygon;\n}(IsometricStarPolygonAbstract));\n\n\n;// ./src/@classes/public/IsometricStarPolygon/index.ts\n\n\n;// ./src/@classes/public/IsometricPath/IsometricPath.ts\nvar IsometricPath_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar IsometricPath = (function (_super) {\n IsometricPath_extends(IsometricPath, _super);\n function IsometricPath(props) {\n if (props === void 0) { props = {}; }\n var _this = _super.call(this, props, SVG_ELEMENTS.path) || this;\n _this.getPathFromCommands = function (commands) { return getSVGPath(parseDrawCommands("".concat(commands)), _this.data.centerX, _this.data.centerY, _this.data.scale, _this._autoclose); };\n _this.commands = [];\n _this._autoclose = \'autoclose\' in props\n ? props.autoclose\n : true;\n return _this;\n }\n IsometricPath.prototype.updateSubClassAnimations = function () {\n var _this = this;\n this.animations.forEach(function (animation) {\n if (animation.property === \'path\') {\n var properties = getAnimationProperties(_this.getPathFromCommands.bind(_this), animation);\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animate);\n }\n if (!animation.element.parentNode) {\n _this.element.appendChild(animation.element);\n }\n _this.addAnimationBasicProperties(\'d\', animation);\n addSVGProperties(animation.element, properties);\n }\n });\n };\n IsometricPath.prototype.getCommands = function () {\n return this.commands;\n };\n Object.defineProperty(IsometricPath.prototype, "autoclose", {\n get: function () {\n return this._autoclose;\n },\n set: function (value) {\n this._autoclose = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n IsometricPath.prototype.update = function () {\n this.updateGraphic(undefined, this.autoclose);\n return this;\n };\n IsometricPath.prototype.clear = function () {\n this.commands.splice(0);\n addSVGProperties(this.element, {\n d: \'\'\n });\n return this;\n };\n IsometricPath.prototype.moveTo = function (right, left, top) {\n this.commands.push({\n command: Command.move,\n point: { r: right, l: left, t: top }\n });\n this.update();\n return this;\n };\n IsometricPath.prototype.lineTo = function (right, left, top) {\n this.commands.push({\n command: Command.line,\n point: { r: right, l: left, t: top }\n });\n this.update();\n return this;\n };\n IsometricPath.prototype.curveTo = function (controlRight, controlLeft, controlTop, right, left, top) {\n this.commands.push({\n command: Command.curve,\n control: { r: controlRight, l: controlLeft, t: controlTop },\n point: { r: right, l: left, t: top }\n });\n this.update();\n return this;\n };\n IsometricPath.prototype.mt = function (right, left, top) {\n return this.moveTo(right, left, top);\n };\n IsometricPath.prototype.lt = function (right, left, top) {\n return this.lineTo(right, left, top);\n };\n IsometricPath.prototype.ct = function (controlRight, controlLeft, controlTop, right, left, top) {\n return this.curveTo(controlRight, controlLeft, controlTop, right, left, top);\n };\n IsometricPath.prototype.draw = function (commands) {\n this.commands = parseDrawCommands(commands);\n this.update();\n return this;\n };\n IsometricPath.prototype.addAnimation = function (animation) {\n return _super.prototype.addAnimation.call(this, animation);\n };\n return IsometricPath;\n}(IsometricPathAbstract));\n\n\n;// ./src/@classes/public/IsometricPath/index.ts\n\n\n;// ./src/@classes/public/IsometricText/IsometricText.ts\nvar IsometricText_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar IsometricText_assign = (undefined && undefined.__assign) || function () {\n IsometricText_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return IsometricText_assign.apply(this, arguments);\n};\nvar IsometricText_rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\nvar IsometricText = (function (_super) {\n IsometricText_extends(IsometricText, _super);\n function IsometricText(props) {\n var _a;\n var _this = this;\n var planeView = props.planeView, _b = props.text, text = _b === void 0 ? \'\' : _b, _c = props.fontFamily, fontFamily = _c === void 0 ? \'Arial\' : _c, _d = props.fontSize, fontSize = _d === void 0 ? 12 : _d, _e = props.fontStyle, fontStyle = _e === void 0 ? \'normal\' : _e, _f = props.fontWeight, fontWeight = _f === void 0 ? \'normal\' : _f, _g = props.origin, origin = _g === void 0 ? [\'center\', \'center\'] : _g, _h = props.right, right = _h === void 0 ? 0 : _h, _j = props.left, left = _j === void 0 ? 0 : _j, _k = props.top, top = _k === void 0 ? 0 : _k, _l = props.rotation, rotation = _l === void 0 ? 0 : _l, _m = props.selectable, selectable = _m === void 0 ? true : _m, rest = IsometricText_rest(props, ["planeView", "text", "fontFamily", "fontSize", "fontStyle", "fontWeight", "origin", "right", "left", "top", "rotation", "selectable"]);\n _this = _super.call(this, rest, SVG_ELEMENTS.group) || this;\n _this._originHash = (_a = {},\n _a[ORIGIN.CENTER] = \'middle\',\n _a[ORIGIN.LEFT] = \'start\',\n _a[ORIGIN.RIGHT] = \'end\',\n _a[ORIGIN.TOP] = \'hanging\',\n _a[ORIGIN.BOTTOM] = \'baseline\',\n _a);\n _this.commonAnimationAttributes = {\n attributeName: \'transform\',\n attributeType: \'XML\',\n additive: \'sum\',\n fill: \'freeze\'\n };\n _this.getMatrixTransform = function (props) {\n var transformMatrix = getPatternTransform(_this.getPositionTransform(props), _this.planeView, 1);\n return "".concat(transformMatrix, " rotate(").concat(_this.rotation, ")");\n };\n _this._textElement = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.text);\n _this._tspan = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.tspan);\n _this._textElement.appendChild(_this._tspan);\n _this.element.appendChild(_this._textElement);\n _this.planeView = planeView;\n _this.fontFamily = fontFamily;\n _this.fontSize = fontSize;\n _this.fontStyle = fontStyle;\n _this.fontWeight = fontWeight;\n _this.selectable = selectable;\n _this.origin = origin;\n _this.right = right;\n _this.left = left;\n _this.top = top;\n _this.rotation = rotation;\n _this.text = text;\n return _this;\n }\n IsometricText.prototype.getPositionTransform = function (props, fromCenter) {\n if (fromCenter === void 0) { fromCenter = true; }\n return getPointFromIsometricPoint(fromCenter\n ? this.data.centerX\n : 0, fromCenter\n ? this.data.centerY\n : 0, {\n r: props.right,\n l: props.left,\n t: props.top\n }, this.data.scale);\n };\n IsometricText.prototype.updateSubClassAnimations = function () {\n var _this = this;\n var props = {\n right: 0,\n left: 0,\n top: 0,\n rotation: 0,\n };\n this.animations.forEach(function (animation) {\n var isNativeSVGProperty = isSVGProperty(animation.property);\n if (!isNativeSVGProperty) {\n if (Object.prototype.hasOwnProperty.call(props, animation.property)) {\n var property_1 = animation.property;\n var isRotation_1 = property_1 === \'rotation\';\n var commonProps = IsometricText_assign(IsometricText_assign({}, _this.commonAnimationAttributes), { type: isRotation_1\n ? \'rotate\'\n : \'translate\', begin: \'indefinite\' });\n var properties = void 0;\n if (animation.values) {\n if (Array.isArray(animation.values)) {\n properties = IsometricText_assign({ values: animation.values.map(function (value) {\n if (isRotation_1) {\n return "".concat(value);\n }\n else {\n var modifiedArgs = IsometricText_assign({}, props);\n modifiedArgs[property_1] = +value - _this[property_1];\n var coords = _this.getPositionTransform(modifiedArgs, false);\n return "".concat(coords.x, ",").concat(coords.y);\n }\n }).join(\';\') }, commonProps);\n }\n else {\n if (isRotation_1) {\n properties = IsometricText_assign({ values: "".concat(animation.values) }, commonProps);\n }\n else {\n var modifiedArgs = IsometricText_assign({}, props);\n modifiedArgs[property_1] = +animation.values - _this[property_1];\n var coords = _this.getPositionTransform(modifiedArgs, false);\n properties = IsometricText_assign({ values: "".concat(coords.x, ",").concat(coords.y) }, commonProps);\n }\n }\n }\n else {\n if (isRotation_1) {\n properties = IsometricText_assign({ from: "".concat(animation.from), to: "".concat(animation.to) }, commonProps);\n }\n else {\n var fromArgs = IsometricText_assign({}, props);\n var toArgs = IsometricText_assign({}, props);\n fromArgs[property_1] = +animation.from - _this[property_1];\n toArgs[property_1] = +animation.to - _this[property_1];\n var coordsFrom = _this.getPositionTransform(fromArgs, false);\n var coordsTo = _this.getPositionTransform(toArgs, false);\n properties = IsometricText_assign({ from: "".concat(coordsFrom.x, ",").concat(coordsFrom.y), to: "".concat(coordsTo.x, ",").concat(coordsTo.y) }, commonProps);\n }\n }\n if (!animation.element) {\n animation.element = document.createElementNS(SVG_NAMESPACE, SVG_ELEMENTS.animateTransform);\n }\n _this.addAnimationBasicProperties(\'transform\', animation);\n addSVGProperties(animation.element, properties);\n if (!animation.element.parentNode) {\n if (isRotation_1) {\n _this._textElement.appendChild(animation.element);\n }\n else {\n _this.element.appendChild(animation.element);\n }\n }\n window.requestAnimationFrame(function () {\n animation.element.beginElement();\n });\n }\n }\n });\n };\n IsometricText.prototype.update = function () {\n if (elementHasSVGParent(this.element)) {\n var transform = this.getMatrixTransform({\n right: this.right,\n left: this.left,\n top: this.top\n });\n addSVGProperties(this._textElement, { transform: transform });\n this._tspan.textContent = this._text;\n this.updatePatternTransform({ x: 0, y: 0 }, this.planeView);\n this.updateAnimations();\n }\n return this;\n };\n IsometricText.prototype.clear = function () {\n this.text = \'\';\n this.update();\n return this;\n };\n Object.defineProperty(IsometricText.prototype, "text", {\n get: function () {\n return this._text;\n },\n set: function (value) {\n this._text = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "planeView", {\n get: function () {\n return this._planeView;\n },\n set: function (value) {\n this._planeView = value;\n this.update();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontFamily", {\n get: function () {\n return this._fontFamily;\n },\n set: function (value) {\n this._fontFamily = value;\n addSVGProperties(this._tspan, {\n \'font-family\': this._fontFamily\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontSize", {\n get: function () {\n return this._fontSize;\n },\n set: function (value) {\n this._fontSize = value;\n addSVGProperties(this._tspan, {\n \'font-size\': "".concat(this._fontSize, "px")\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontStyle", {\n get: function () {\n return this._fontStyle;\n },\n set: function (value) {\n this._fontStyle = value;\n addSVGProperties(this._tspan, {\n \'font-style\': "".concat(this._fontStyle)\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "fontWeight", {\n get: function () {\n return this._fontWeight;\n },\n set: function (value) {\n this._fontWeight = value;\n addSVGProperties(this._tspan, {\n \'font-weight\': "".concat(this._fontWeight)\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "selectable", {\n get: function () {\n return this._selectable;\n },\n set: function (value) {\n this._selectable = value;\n if (this._selectable) {\n this._textElement.removeAttribute(\'style\');\n }\n else {\n addSVGProperties(this._textElement, {\n style: [\n \'-webkit-user-select\',\n \'-moz-user-select\',\n \'-ms-user-select\',\n \'user-select\',\n \'pointer-events\'\n ].map(function (decl) { return "".concat(decl, ": none"); }).join(\';\')\n });\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "origin", {\n get: function () {\n return this._origin;\n },\n set: function (value) {\n this._origin = value;\n var _a = this._origin, textAnchor = _a[0], alignmentBaseline = _a[1];\n addSVGProperties(this._tspan, {\n \'text-anchor\': this._originHash[textAnchor],\n \'alignment-baseline\': this._originHash[alignmentBaseline]\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "right", {\n get: function () {\n return this._right;\n },\n set: function (value) {\n if (this._right !== value) {\n this._right = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "left", {\n get: function () {\n return this._left;\n },\n set: function (value) {\n if (this._left !== value) {\n this._left = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "top", {\n get: function () {\n return this._top;\n },\n set: function (value) {\n if (this._top !== value) {\n this._top = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(IsometricText.prototype, "rotation", {\n get: function () {\n return this._rotation;\n },\n set: function (value) {\n if (this._rotation !== value) {\n this._rotation = value;\n this.update();\n }\n },\n enumerable: false,\n configurable: true\n });\n return IsometricText;\n}(IsometricGraphicAbstract));\n\n\n;// ./src/@classes/public/IsometricText/index.ts\n\n\n;// ./src/index.ts\n\n\n\n\n\n\n\n\n\n\n;// ./demo/demo1/index.js\n/* harmony default export */ const demo1 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricRectangle, PlaneView } = IsometricModule;\n\n function toggleColor() {\n this.fillColor = this.fillColor === \'white\' ? \'#EEE\' : \'white\';\n }\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonProps = {height: 1, width: 1};\n const topPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.TOP});\n const rightPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.FRONT});\n const leftPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.SIDE});\n\n topPiece.top = 1;\n topPiece.addEventListener(\'click\', toggleColor, true);\n\n rightPiece.right = 1;\n rightPiece.addEventListener(\'click\', toggleColor, true);\n\n leftPiece.left = 1;\n leftPiece.addEventListener(\'click\', toggleColor, true);\n\n cube\n .addChild(topPiece)\n .addChild(rightPiece)\n .addChild(leftPiece);\n\n});\n;// ./demo/demo2/index.js\n/* harmony default export */ const demo2 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath, IsometricRectangle, IsometricPentagram, PlaneView } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonProps = {height: 1, width: 1};\n\n const duration = 3;\n\n const rectangleAnimationProps = {\n property: \'height\',\n duration,\n values: [1, 0.5, 1]\n };\n\n const colorAnimationProps = {\n property: \'fillColor\',\n duration,\n values: [\'#FFF\', \'#DDD\', \'#FFF\']\n };\n\n const topPiece = new IsometricPath();\n const star = new IsometricPentagram({ radius: 0.35, planeView: PlaneView.TOP, right: 0.5, left: 0.5, top: 1});\n const rightPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.FRONT, right: 1});\n const leftPiece = new IsometricRectangle({...commonProps, planeView: PlaneView.SIDE, left: 1});\n\n topPiece\n .moveTo(0, 0, 1)\n .lineTo(1, 0, 1)\n .lineTo(1, 1, 1)\n .lineTo(0, 1, 1);\n\n topPiece\n .addAnimation({\n property: \'path\',\n duration,\n values: [\n \'M0 0 1 L1 0 1 L1 1 1 L0 1 1\',\n \'M0 0 0.5 L1 0 0.5 L1 1 0.5 L0 1 0.5\',\n \'M0 0 1 L1 0 1 L1 1 1 L0 1 1\'\n ]\n })\n .addAnimation(colorAnimationProps);\n\n star\n .addAnimation({\n property: \'top\',\n duration,\n values: [1, 0.5, 1]\n });\n\n rightPiece\n .addAnimation(rectangleAnimationProps)\n .addAnimation(colorAnimationProps);\n\n leftPiece\n .addAnimation(rectangleAnimationProps)\n .addAnimation(colorAnimationProps);\n\n cube.addEventListener(\'click\', function() {\n if (this.animated) {\n this.pauseAnimations();\n } else {\n this.resumeAnimations();\n }\n });\n\n cube.addChildren(topPiece, rightPiece, leftPiece, star);\n\n});\n;// ./demo/images/block_side.png\nconst block_side_namespaceObject = __webpack_require__.p + "images/block_side.png";\n;// ./demo/images/block_top.png\nconst block_top_namespaceObject = __webpack_require__.p + "images/block_top.png";\n;// ./demo/demo3/index.js\n\n\n\n/* harmony default export */ const demo3 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricRectangle, IsometricText, PlaneView } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const rectangleCommonProps = { height: 1, width: 1 };\n\n const textCommonProps = {\n fontSize: 15,\n fillColor: \'#666\',\n strokeWidth: 0,\n right: 0.5,\n left: 0.5,\n top: 0.5,\n selectable: false\n };\n\n const pieces = [PlaneView.TOP, PlaneView.FRONT, PlaneView.SIDE].map((view, index) => {\n return {\n face: new IsometricRectangle({...rectangleCommonProps, planeView: view}),\n label: new IsometricText({...textCommonProps, planeView: view}),\n property: [\'top\', \'right\', \'left\'][index]\n };\n });\n\n pieces.forEach((piece) => {\n\n const { face, label, property } = piece;\n\n face[property] = 1;\n label[property] = 1;\n label.text = `${property.toUpperCase()} 0º`;\n\n face.addEventListener(\'click\', () => {\n const rotation = label.rotation + 45;\n label.rotation = rotation === 360 ? 0 : rotation;\n label.text = label.text.replace(/\\d+/, label.rotation);\n });\n\n cube.addChild(piece.face);\n cube.addChild(piece.label);\n });\n\n});\n;// ./demo/demo4/index.js\n/* harmony default export */ const demo4 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricGroup, IsometricPath } = IsometricModule;\n\n const isometric = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const bottomT = new IsometricPath();\n const bottomR = new IsometricPath();\n const bottomL = new IsometricPath();\n\n const topT = new IsometricPath();\n const topR = new IsometricPath();\n const topL = new IsometricPath();\n\n bottomT.mt(0, 0, .5).lt(1, 0, .5).lt(1, 1, .5).lt(0, 1, .5);\n bottomR.mt(1, 0, .5).lt(1, 0, 0).lt(1, 1, 0).lt(1, 1, .5);\n bottomL.mt(1, 1, .5).lt(1, 1, 0).lt(0, 1, 0).lt(0, 1, .5);\n\n topT.mt(.25, .25, 1).lt(.75, .25, 1).lt(.75, .75, .75).lt(.25, .75, .75);\n topR.mt(.75, .25, 1).lt(.75, .75, .75).lt(.75, .75, .25).lt(.75, .25, .25);\n topL.mt(.75, .75, .75).lt(.25, .75, .75).lt(.25, .75, .25).lt(.75, .75, .25);\n\n const bottomPiece = new IsometricGroup();\n const topPiece = new IsometricGroup();\n topPiece.top = .25;\n\n bottomPiece.addChildren(bottomT, bottomR, bottomL);\n topPiece.addChildren(topT, topR, topL);\n\n let flip = true;\n\n topPiece.addEventListener(\'click\', function() {\n if (this.right) {\n this.right = 0;\n return;\n }\n this.right = flip ? 0.25 : -0.25;\n flip = !flip;\n });\n\n isometric.addChildren(bottomPiece, topPiece);\n\n});\n;// ./demo/demo5/index.js\n/* harmony default export */ const demo5 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath } = IsometricModule;\n\n const isometric = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const right = new IsometricPath();\n const top1 = new IsometricPath();\n const top2 = new IsometricPath();\n const top3 = new IsometricPath();\n const top4 = new IsometricPath();\n const left1 = new IsometricPath();\n const left2 = new IsometricPath();\n\n // M r l t (Move to right left top)\n // L r l t (Line to right left top)\n // C cr cl ct r l t (Curve to control-right control-left control-top right left top)\n right.draw(\'M1 0 0 L1 1 0 L1 1 0.25 L1 0.5 0.25 L1 0.5 1 L1 0 1\');\n top1.draw(\'M0.25 0.5 1 C0.5 0.5 0.75 0.75 0.5 1 L0.75 0 1 C0.5 0 0.75 0.25 0 1 L0.25 0.5 1\');\n top2.draw(\'M1 0 1 L0.75 0 1 L0.75 0.5 1 L1 0.5 1 L1 0 1 M0 0 1 L0.25 0 1 L0.25 0.5 1 L0 0.5 1 L0 0 1\');\n top3.draw(\'M0 0.5 0.5 L0.5 0.5 0.5 L0.5 1 0.5 L0 1 0.5\');\n top4.draw(\'M0.5 0.5 0.5 L1 0.5 0.25 L1 1 0.25 L0.5 1 0.5\');\n left1.draw(\'M0 0.5 1 L0 0.5 0.5 L0.5 0.5 0.5 L1 0.5 0.25 L1 0.5 1 L0.75 0.5 1 C0.5 0.5 0.75 0.25 0.5 1 L0 0.5 1\');\n left2.draw(\'M0 1 0.5 L0.5 1 0.5 L1 1 0.25 L1 1 0 L0 1 0\');\n\n isometric.addChildren(right, top1, top2, top3, top4, left1, left2);\n\n});\n;// ./demo/demo6/index.js\n/* harmony default export */ const demo6 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const under = new IsometricPath({ fillColor: \'#EEE\' });\n const top = new IsometricPath();\n const right = new IsometricPath();\n const left = new IsometricPath();\n\n under\n .mt(0, 0, 1)\n .mt(0.25, 0, 1).ct(0.5, 0, 0.75, 0.75, 0, 1).lt(1, 0, 1)\n .lt(1, 0, 0.75).ct(0.75, 0, 0.5, 1, 0, 0.25).lt(1, 0, 0)\n .lt(1, 0.25, 0).ct(0.75, 0.5, 0, 1, 0.75, 0).lt(1, 1, 0)\n .lt(0.75, 1, 0).ct(0.5, 0.75, 0, 0.25, 1, 0).lt(0, 1, 0)\n .lt(0, 1, 0.25).ct(0, 0.75, 0.5, 0, 1, 0.75).lt(0, 1, 1)\n .lt(0, 0.75, 1).ct(0, 0.5, 0.75, 0, 0.25, 1).lt(0, 0, 1);\n\n top\n .mt(0, 0, 1)\n .lt(0.25, 0, 1).ct(0.5, 0.25, 1, 0.75, 0, 1).lt(1, 0, 1)\n .lt(1, 0.25, 1).ct(0.75, 0.5, 1, 1, 0.75, 1).lt(1, 1, 1)\n .lt(0.75, 1, 1).ct(0.5, 0.75, 1, 0.25, 1, 1).lt(0, 1, 1)\n .lt(0, 0.75, 1).ct(0.25, 0.5, 1, 0, 0.25, 1).lt(0, 0, 1);\n\n right\n .mt(1, 0, 1)\n .lt(1, 0, 0.75).ct(1, 0.25, 0.5, 1, 0, 0.25).lt(1, 0, 0)\n .lt(1, 0.25, 0).ct(1, 0.5, 0.25, 1, 0.75, 0).lt(1, 1, 0)\n .lt(1, 1, 0.25).ct(1, 0.75, 0.5, 1, 1, 0.75).lt(1, 1, 1)\n .lt(1, 0.75, 1).ct(1, 0.5, 0.75, 1, 0.25, 1).lt(1, 0, 1);\n\n left\n .mt(1, 1, 1)\n .lt(1, 1, 0.75).ct(0.75, 1, 0.5, 1, 1, 0.25).lt(1, 1, 0)\n .lt(0.75, 1, 0).ct(0.5, 1, 0.25, 0.25, 1, 0).lt(0, 1, 0)\n .lt(0, 1, 0.25).ct(0.25, 1, 0.5, 0, 1, 0.75).lt(0, 1, 1)\n .lt(0.25, 1, 1).ct(0.5, 1, 0.75, 0.75, 1, 1).lt(1, 1, 1);\n\n cube.addChildren(under, top, right, left);\n\n});\n;// ./demo/demo7/index.js\n/* harmony default export */ const demo7 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricStarPolygon, PlaneView } = IsometricModule;\n\n const cube = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonProps = {\n radius: 0.5,\n points: 8,\n density: 2,\n right: 0.5,\n left: 0.5,\n top: 0.5\n };\n\n const planes = [PlaneView.SIDE, PlaneView.FRONT, PlaneView.TOP];\n\n const planePropsHash = {\n [PlaneView.TOP]: \'top\',\n [PlaneView.FRONT]: \'right\',\n [PlaneView.SIDE]: \'left\'\n };\n\n planes.forEach((planeView) => {\n const props = { ...commonProps, planeView };\n const coord = planePropsHash[planeView];\n const starPolygonBack = new IsometricStarPolygon({...props, id: `${coord}-back`, fillColor: \'#EEE\'});\n const starPolygonFront = new IsometricStarPolygon({...props, id: `${coord}-front`});\n starPolygonBack[coord] = 0;\n starPolygonFront[coord] = 1;\n cube.addChildren(starPolygonBack, starPolygonFront);\n });\n\n planes.forEach((planeView) => {\n const coord = planePropsHash[planeView];\n const starPolygonBack = cube.getChildById(`${coord}-back`);\n const starPolygonFront = cube.getChildById(`${coord}-front`);\n cube.sendChildToBack(starPolygonBack);\n cube.bringChildToFront(starPolygonFront);\n });\n\n});\n;// ./demo/demo8/index.js\n/* harmony default export */ const demo8 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricGroup, IsometricRectangle, PlaneView } = IsometricModule;\n\n const canvas = new IsometricCanvas({\n container,\n backgroundColor: \'#CCC\',\n scale: 20,\n width: 500,\n height: 320\n });\n\n function resetPlanes() {\n cube.right = cube.left = cube.top = 0;\n planeTop.fillOpacity = planeRight.fillOpacity = planeLeft.fillOpacity = 0.25;\n }\n\n function changePlane() {\n resetPlanes();\n this.fillOpacity = 1;\n cube.drag = this.planeView;\n }\n\n const planeProps = { height: 6, width: 6, fillOpacity: 0.25 };\n const planeTop = new IsometricRectangle({ ...planeProps, planeView: PlaneView.TOP, fillOpacity: 1 });\n const planeRight = new IsometricRectangle({ ...planeProps, planeView: PlaneView.FRONT });\n const planeLeft = new IsometricRectangle({ ...planeProps, planeView: PlaneView.SIDE });\n\n const cubeProps = { height: 1, width: 1 };\n const cubeTop = new IsometricRectangle({ ...cubeProps, planeView: PlaneView.TOP, top: 1 });\n const cubeRight = new IsometricRectangle({ ...cubeProps, planeView: PlaneView.FRONT, right: 1 });\n const cubeLeft = new IsometricRectangle({ ...cubeProps, planeView: PlaneView.SIDE, left: 1 });\n\n const cube = new IsometricGroup();\n\n const bounds = [0, 5];\n cube.drag = \'TOP\';\n cube.bounds = { top: bounds, right: bounds, left: bounds };\n\n planeTop.addEventListener(\'click\', changePlane, true);\n planeRight.addEventListener(\'click\', changePlane, true);\n planeLeft.addEventListener(\'click\', changePlane, true);\n\n cube.addChildren(cubeTop, cubeRight, cubeLeft);\n canvas.addChildren(planeTop, planeRight, planeLeft, cube);\n\n});\n;// ./demo/demo9/index.js\n\n\n\n/* harmony default export */ const demo9 = (( IsometricModule, container ) => {\n\n const { IsometricCanvas, IsometricPath, IsometricRectangle, PlaneView, Axis } = IsometricModule;\n\n const isometric = new IsometricCanvas({\n container,\n backgroundColor: \'#8AAA3F\',\n scale: 120,\n width: 500,\n height: 320\n });\n\n const commonTextureProps = {\n height: 1,\n width: 1,\n pixelated: true\n };\n\n const textureSides = {\n url: \'images/block_side.png\',\n ...commonTextureProps\n };\n\n const textureTop = {\n url: \'images/block_top.png\',\n planeView: PlaneView.TOP,\n rotation: {\n axis: Axis.LEFT,\n value: 26.5650\n },\n ...commonTextureProps\n };\n\n const side = new IsometricPath({\n texture: {\n planeView: PlaneView.SIDE,\n ...textureSides\n }\n });\n\n const front = new IsometricRectangle({\n planeView: PlaneView.FRONT,\n height: 0.5,\n width: 1,\n texture: textureSides\n });\n\n const chop = new IsometricPath({\n texture: textureTop\n });\n\n side.draw(\'M1 1 0 L1 1 0.5 L0 1 1 L0 1 0\');\n chop.draw(\'M1 1 0.5 L0 1 1 L0 0 1 L1 0 0.5\');\n\n side.left = 1;\n front.right = 1;\n\n isometric.addChildren(side, front, chop);\n\n});\n;// ./demo/demo.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst functioToString = (fn) => {\n const article = document.createElement(\'article\');\n const pre = document.createElement(\'pre\');\n article.classList.add(\'function-container\');\n pre.classList.add(\'prettyprint\');\n article.appendChild(pre);\n pre.innerHTML = fn.toString();\n return article;\n};\n\nconst demos = new Map([\n [\'demo1\', demo1],\n [\'demo2\', demo2],\n [\'demo3\', demo3],\n [\'demo4\', demo4],\n [\'demo5\', demo5],\n [\'demo6\', demo6],\n [\'demo7\', demo7],\n [\'demo8\', demo8],\n [\'demo9\', demo9],\n]);\n\ndocument.addEventListener(\'DOMContentLoaded\', function () {\n\n demos.forEach((module, div) => {\n const demo = document.getElementById(div);\n const container = document.createElement(\'div\');\n const wrapper = document.createElement(\'div\');\n\n container.classList.add(\'demo-container\');\n wrapper.classList.add(\'demo-wrapper\');\n\n module(src_namespaceObject, wrapper);\n container.appendChild(wrapper);\n demo.appendChild(container);\n demo.appendChild(functioToString(module));\n });\n\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxFOztBQzlEa0Q7QUFDZ0I7QUFDdkM7QUFDTDtBQUNtQjtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLG1CQUFlO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY29uc3RhbnRzL2luZGV4LnRzP2U1NTEiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0B1dGlscy9tYXRoLnRzPzc3MTQiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0B1dGlscy9tYXRyaXgudHM/NmI3OSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQHV0aWxzL3N2Zy50cz9hYWNmIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9Ac3RvcmUvaW5kZXgudHM/MzI3OSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU3RvcmUvSXNvbWV0cmljU3RvcmUudHM/MTk1ZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU3RvcmUvaW5kZXgudHM/ZjZmZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljRWxlbWVudEFic3RyYWN0L0lzb21ldHJpY0VsZW1lbnRBYnN0cmFjdC50cz9mNTZkIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNFbGVtZW50QWJzdHJhY3QvaW5kZXgudHM/M2E5OCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0L0lzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC50cz8xMDg1Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNHcmFwaGljQWJzdHJhY3QvaW5kZXgudHM/ZThhNSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QudHM/OGQyZCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QvaW5kZXgudHM/OTZkYSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY0NhbnZhcy9Jc29tZXRyaWNDYW52YXMudHM/YjdmMyIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY0NhbnZhcy9pbmRleC50cz81ZDNjIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AdXRpbHMvb3RoZXIudHM/MjAwOCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QvY29uc3RhbnRzLnRzPzQ0NmEiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnRzPzc5ZjIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0L2luZGV4LnRzP2MzYTEiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNHcm91cC9Jc29tZXRyaWNHcm91cC50cz9iOWFjIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljR3JvdXAvaW5kZXgudHM/ODBkZSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljUGF0aEFic3RyYWN0L0lzb21ldHJpY1BhdGhBYnN0cmFjdC50cz9lOWJiIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNQYXRoQWJzdHJhY3QvaW5kZXgudHM/ZjRmZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU2hhcGVBYnN0cmFjdC9Jc29tZXRyaWNTaGFwZUFic3RyYWN0LnRzPzc2NDIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1NoYXBlQWJzdHJhY3QvaW5kZXgudHM/YTUxMCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1JlY3RhbmdsZS9Jc29tZXRyaWNSZWN0YW5nbGUudHM/MzdlZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1JlY3RhbmdsZS9pbmRleC50cz84NTFiIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljQ2lyY2xlL0lzb21ldHJpY0NpcmNsZS50cz8wY2I3Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljQ2lyY2xlL2luZGV4LnRzPzM5ZjciLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QvSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC50cz9iZTg1Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0L2luZGV4LnRzP2JhZWQiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNQZW50YWdyYW0vSXNvbWV0cmljUGVudGFncmFtLnRzPzRlNDYiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNQZW50YWdyYW0vaW5kZXgudHM/NDdjNCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1N0YXJQb2x5Z29uL0lzb21ldHJpY1N0YXJQb2x5Z29uLnRzP2QxNTUiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNTdGFyUG9seWdvbi9pbmRleC50cz8zZGRkIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL3NyYy9AY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljUGF0aC9Jc29tZXRyaWNQYXRoLnRzPzUwMDEiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNQYXRoL2luZGV4LnRzPzIyZWMiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vc3JjL0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNUZXh0L0lzb21ldHJpY1RleHQudHM/ZjQxOCIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1RleHQvaW5kZXgudHM/YjFhZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9zcmMvaW5kZXgudHM/MGQxZiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW8xL2luZGV4LmpzPzhlMTMiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vZGVtby9kZW1vMi9pbmRleC5qcz83YjZkIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL2RlbW8vZGVtbzMvaW5kZXguanM/NmQ4NyIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW80L2luZGV4LmpzPzQ1YWQiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vZGVtby9kZW1vNS9pbmRleC5qcz9iNGIxIiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL2RlbW8vZGVtbzYvaW5kZXguanM/ZmRhNSIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW83L2luZGV4LmpzPzBhZmIiLCJ3ZWJwYWNrOi8vQGVsY2hpbmluZXQvaXNvbWV0cmljLy4vZGVtby9kZW1vOC9pbmRleC5qcz80YzA3Iiwid2VicGFjazovL0BlbGNoaW5pbmV0L2lzb21ldHJpYy8uL2RlbW8vZGVtbzkvaW5kZXguanM/MjE3NiIsIndlYnBhY2s6Ly9AZWxjaGluaW5ldC9pc29tZXRyaWMvLi9kZW1vL2RlbW8uanM/ZmNkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuZXhwb3J0IHZhciBTVkdfRUxFTUVOVFM7XG4oZnVuY3Rpb24gKFNWR19FTEVNRU5UUykge1xuICAgIFNWR19FTEVNRU5UU1tcInN2Z1wiXSA9IFwic3ZnXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wiZ3JvdXBcIl0gPSBcImdcIjtcbiAgICBTVkdfRUxFTUVOVFNbXCJwYXRoXCJdID0gXCJwYXRoXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wicmVjdFwiXSA9IFwicmVjdFwiO1xuICAgIFNWR19FTEVNRU5UU1tcInRleHRcIl0gPSBcInRleHRcIjtcbiAgICBTVkdfRUxFTUVOVFNbXCJ0c3BhblwiXSA9IFwidHNwYW5cIjtcbiAgICBTVkdfRUxFTUVOVFNbXCJwYXR0ZXJuXCJdID0gXCJwYXR0ZXJuXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wiaW1hZ2VcIl0gPSBcImltYWdlXCI7XG4gICAgU1ZHX0VMRU1FTlRTW1wiYW5pbWF0ZVwiXSA9IFwiYW5pbWF0ZVwiO1xuICAgIFNWR19FTEVNRU5UU1tcImFuaW1hdGVUcmFuc2Zvcm1cIl0gPSBcImFuaW1hdGVUcmFuc2Zvcm1cIjtcbn0pKFNWR19FTEVNRU5UUyB8fCAoU1ZHX0VMRU1FTlRTID0ge30pKTtcbmV4cG9ydCB2YXIgU1ZHX1BST1BFUlRJRVM7XG4oZnVuY3Rpb24gKFNWR19QUk9QRVJUSUVTKSB7XG4gICAgU1ZHX1BST1BFUlRJRVNbXCJ2aWV3Qm94XCJdID0gXCJ2aWV3Qm94XCI7XG59KShTVkdfUFJPUEVSVElFUyB8fCAoU1ZHX1BST1BFUlRJRVMgPSB7fSkpO1xuZXhwb3J0IHZhciBERUNJTUFMUyA9IDY7XG5leHBvcnQgdmFyIFNRUlQzID0gKyhNYXRoLnNxcnQoMykudG9GaXhlZChERUNJTUFMUykpO1xuZXhwb3J0IHZhciBIU1FSVDMgPSArKChNYXRoLnNxcnQoMykgLyAyKS50b0ZpeGVkKERFQ0lNQUxTKSk7XG5leHBvcnQgdmFyIERFRkFVTFRfV0lEVEggPSA2NDA7XG5leHBvcnQgdmFyIERFRkFVTFRfSEVJR0hUID0gNDgwO1xudmFyIE4gPSAnKC0/XFxcXGQrKD86XFxcXC5cXFxcZCspP3wtP1xcXFwuXFxcXGQrKSc7XG52YXIgUyA9ICdcXFxccyonO1xudmFyIFNTID0gJ1xcXFxzKyc7XG52YXIgUE9JTlQgPSBcIlwiLmNvbmNhdChOKS5jb25jYXQoU1MpLmNvbmNhdChOKS5jb25jYXQoU1MpLmNvbmNhdChOKTtcbnZhciBDVVJWRSA9IFwiXCIuY29uY2F0KFBPSU5UKS5jb25jYXQoU1MpLmNvbmNhdChQT0lOVCk7XG5leHBvcnQgdmFyIENPTU1BTkRTX1JFR0VYUCA9IG5ldyBSZWdFeHAoXCIoPzooTXxMKVwiLmNvbmNhdChTKS5jb25jYXQoUE9JTlQpLmNvbmNhdChTLCBcInwoQylcIikuY29uY2F0KFMpLmNvbmNhdChDVVJWRSwgXCIpXCIpLmNvbmNhdChTKSwgJ2cnKTtcbmV4cG9ydCB2YXIgU0NBTEUgPSBNYXRoLnNxcnQoMyAvIDIpO1xuZXhwb3J0IHZhciBST1RfNjAgPSBNYXRoLlBJIC8gMztcbmV4cG9ydCB2YXIgUk9UXzQ1ID0gTWF0aC5QSSAvIDQ7XG5leHBvcnQgdmFyIFJPVF9DTUEgPSBNYXRoLmF0YW4oTWF0aC5TUVJUMik7XG5leHBvcnQgdmFyIENvbG9ycztcbihmdW5jdGlvbiAoQ29sb3JzKSB7XG4gICAgQ29sb3JzW1wid2hpdGVcIl0gPSBcIndoaXRlXCI7XG4gICAgQ29sb3JzW1wiYmxhY2tcIl0gPSBcImJsYWNrXCI7XG59KShDb2xvcnMgfHwgKENvbG9ycyA9IHt9KSk7XG5leHBvcnQgdmFyIExpbmVDYXA7XG4oZnVuY3Rpb24gKExpbmVDYXApIHtcbiAgICBMaW5lQ2FwW1wiYnV0dFwiXSA9IFwiYnV0dFwiO1xuICAgIExpbmVDYXBbXCJzcXVhcmVcIl0gPSBcInNxdWFyZVwiO1xuICAgIExpbmVDYXBbXCJyb3VuZFwiXSA9IFwicm91bmRcIjtcbn0pKExpbmVDYXAgfHwgKExpbmVDYXAgPSB7fSkpO1xuZXhwb3J0IHZhciBMaW5lSm9pbjtcbihmdW5jdGlvbiAoTGluZUpvaW4pIHtcbiAgICBMaW5lSm9pbltcIm1pdGVyXCJdID0gXCJtaXRlclwiO1xuICAgIExpbmVKb2luW1wicm91bmRcIl0gPSBcInJvdW5kXCI7XG4gICAgTGluZUpvaW5bXCJiZXZlbFwiXSA9IFwiYmV2ZWxcIjtcbn0pKExpbmVKb2luIHx8IChMaW5lSm9pbiA9IHt9KSk7XG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICBDb21tYW5kW1wibW92ZVwiXSA9IFwibW92ZVwiO1xuICAgIENvbW1hbmRbXCJsaW5lXCJdID0gXCJsaW5lXCI7XG4gICAgQ29tbWFuZFtcImN1cnZlXCJdID0gXCJjdXJ2ZVwiO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG5leHBvcnQgdmFyIFBsYW5lVmlldztcbihmdW5jdGlvbiAoUGxhbmVWaWV3KSB7XG4gICAgUGxhbmVWaWV3W1wiRlJPTlRcIl0gPSBcIkZST05UXCI7XG4gICAgUGxhbmVWaWV3W1wiU0lERVwiXSA9IFwiU0lERVwiO1xuICAgIFBsYW5lVmlld1tcIlRPUFwiXSA9IFwiVE9QXCI7XG59KShQbGFuZVZpZXcgfHwgKFBsYW5lVmlldyA9IHt9KSk7XG5leHBvcnQgdmFyIEF4aXM7XG4oZnVuY3Rpb24gKEF4aXMpIHtcbiAgICBBeGlzW1wiUklHSFRcIl0gPSBcIlJJR0hUXCI7XG4gICAgQXhpc1tcIkxFRlRcIl0gPSBcIkxFRlRcIjtcbiAgICBBeGlzW1wiVE9QXCJdID0gXCJUT1BcIjtcbn0pKEF4aXMgfHwgKEF4aXMgPSB7fSkpO1xuZXhwb3J0IHZhciBUeXBlb2Y7XG4oZnVuY3Rpb24gKFR5cGVvZikge1xuICAgIFR5cGVvZltcIlVOREVGSU5FRFwiXSA9IFwidW5kZWZpbmVkXCI7XG4gICAgVHlwZW9mW1wiTlVNQkVSXCJdID0gXCJudW1iZXJcIjtcbn0pKFR5cGVvZiB8fCAoVHlwZW9mID0ge30pKTtcbmV4cG9ydCB2YXIgRVZFTlRTO1xuKGZ1bmN0aW9uIChFVkVOVFMpIHtcbiAgICBFVkVOVFNbXCJNT1VTRV9NT1ZFXCJdID0gXCJtb3VzZW1vdmVcIjtcbiAgICBFVkVOVFNbXCJNT1VTRV9ET1dOXCJdID0gXCJtb3VzZWRvd25cIjtcbiAgICBFVkVOVFNbXCJNT1VTRV9VUFwiXSA9IFwibW91c2V1cFwiO1xuICAgIEVWRU5UU1tcIlRPVUNIX1NUQVJUXCJdID0gXCJ0b3VjaHN0YXJ0XCI7XG4gICAgRVZFTlRTW1wiVE9VQ0hfTU9WRVwiXSA9IFwidG91Y2htb3ZlXCI7XG4gICAgRVZFTlRTW1wiVE9VQ0hfRU5EXCJdID0gXCJ0b3VjaGVuZFwiO1xufSkoRVZFTlRTIHx8IChFVkVOVFMgPSB7fSkpO1xuZXhwb3J0IHZhciBPUklHSU47XG4oZnVuY3Rpb24gKE9SSUdJTikge1xuICAgIE9SSUdJTltcIkNFTlRFUlwiXSA9IFwiY2VudGVyXCI7XG4gICAgT1JJR0lOW1wiTEVGVFwiXSA9IFwibGVmdFwiO1xuICAgIE9SSUdJTltcIlJJR0hUXCJdID0gXCJyaWdodFwiO1xuICAgIE9SSUdJTltcIlRPUFwiXSA9IFwidG9wXCI7XG4gICAgT1JJR0lOW1wiQk9UVE9NXCJdID0gXCJib3R0b21cIjtcbn0pKE9SSUdJTiB8fCAoT1JJR0lOID0ge30pKTtcbiIsImltcG9ydCB7IEhTUVJUMywgREVDSU1BTFMgfSBmcm9tICdAY29uc3RhbnRzJztcbmV4cG9ydCB2YXIgcm91bmQgPSBmdW5jdGlvbiAobiwgZCkge1xuICAgIHZhciBleHAgPSBNYXRoLnBvdygxMCwgZCk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobiAqIGV4cCkgLyBleHA7XG59O1xuZXhwb3J0IHZhciByYWRpYW4gPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSAqIE1hdGguUEkgLyAxODA7IH07XG5leHBvcnQgdmFyIHNpbmNvcyA9IGZ1bmN0aW9uIChyKSB7IHJldHVybiAoe1xuICAgIHNpbjogcm91bmQoTWF0aC5zaW4ociksIERFQ0lNQUxTKSxcbiAgICBjb3M6IHJvdW5kKE1hdGguY29zKHIpLCBERUNJTUFMUylcbn0pOyB9O1xudmFyIGdldFBvaW50c0RpZmYgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIpIHsgcmV0dXJuICh7XG4gICAgeDogcG9pbnRBLnggLSBwb2ludEIueCxcbiAgICB5OiBwb2ludEEueSAtIHBvaW50Qi55XG59KTsgfTtcbnZhciBnZXRQb2ludHNEaXN0YW5jZSA9IGZ1bmN0aW9uIChwb2ludEEsIHBvaW50Qikge1xuICAgIHZhciBkaWZmID0gZ2V0UG9pbnRzRGlmZihwb2ludEEsIHBvaW50Qik7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhkaWZmLngsIDIpICsgTWF0aC5wb3coZGlmZi55LCAyKSk7XG59O1xudmFyIHRyYW5zbGF0ZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBhbmdsZSwgZGlzdGFuY2UpIHsgcmV0dXJuICh7XG4gICAgeDogcG9pbnQueCArIE1hdGguY29zKGFuZ2xlKSAqIGRpc3RhbmNlLFxuICAgIHk6IHBvaW50LnkgKyBNYXRoLnNpbihhbmdsZSkgKiBkaXN0YW5jZVxufSk7IH07XG52YXIgcm90YXRlID0gZnVuY3Rpb24gKHBvaW50LCBjZW50ZXIsIGFuZ2xlKSB7XG4gICAgdmFyIGRpZmYgPSBnZXRQb2ludHNEaWZmKHBvaW50LCBjZW50ZXIpO1xuICAgIHZhciB4ID0gZGlmZi54ICogTWF0aC5jb3MoYW5nbGUpIC0gZGlmZi55ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgIHZhciB5ID0gZGlmZi54ICogTWF0aC5zaW4oYW5nbGUpICsgZGlmZi55ICogTWF0aC5jb3MoYW5nbGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgeCxcbiAgICAgICAgeTogY2VudGVyLnkgKyB5XG4gICAgfTtcbn07XG52YXIgZ2V0UG9pbnRzQW5nbGUgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIpIHtcbiAgICB2YXIgZGlmZiA9IGdldFBvaW50c0RpZmYocG9pbnRCLCBwb2ludEEpO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKGRpZmYueSwgZGlmZi54KTtcbn07XG5leHBvcnQgdmFyIGdldE9yaWVudGF0aW9uID0gZnVuY3Rpb24gKHAxLCBwMiwgcDMpIHtcbiAgICB2YXIgdmFsdWUgPSAocDIueSAtIHAxLnkpICogKHAzLnggLSBwMi54KSAtIChwMi54IC0gcDEueCkgKiAocDMueSAtIHAyLnkpO1xuICAgIHJldHVybiB2YWx1ZSA+PSAwID8gMCA6IDE7XG59O1xuZXhwb3J0IHZhciBnZXRQb2ludEZyb21Jc29tZXRyaWNQb2ludCA9IGZ1bmN0aW9uIChjZW50ZXJYLCBjZW50ZXJZLCBwb2ludCwgc2NhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByb3VuZChjZW50ZXJYICsgKHBvaW50LnIgLSBwb2ludC5sKSAqIHNjYWxlICogSFNRUlQzLCBERUNJTUFMUyksXG4gICAgICAgIHk6IHJvdW5kKGNlbnRlclkgKyAoKHBvaW50LnIgKyBwb2ludC5sKSAvIDIgLSBwb2ludC50KSAqIHNjYWxlLCBERUNJTUFMUylcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0VG9wUGxhbmVQb2ludEZyb21Db29yZGluYXRlcyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIFhIU1FSVDMgPSB4IC8gSFNRUlQzO1xuICAgIHZhciByaWdodCA9ICh5ICogMiArIFhIU1FSVDMpIC8gMjtcbiAgICB2YXIgbGVmdCA9IHJpZ2h0IC0gWEhTUVJUMztcbiAgICByZXR1cm4ge1xuICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgIGxlZnQ6IGxlZnRcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0RnJvbnRQbGFuZVBvaW50RnJvbUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICB2YXIgbGVmdCA9IC14IC8gSFNRUlQzO1xuICAgIHZhciB0b3AgPSBsZWZ0IC8gMiAtIHk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgdG9wOiB0b3BcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0U2lkZVBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHZhciByaWdodCA9IHggLyBIU1FSVDM7XG4gICAgdmFyIHRvcCA9IHJpZ2h0IC8gMiAtIHk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICB0b3A6IHRvcFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBnZXRFbGxpcHNpc1NwZWNzID0gZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCLCBjb250cm9sKSB7XG4gICAgdmFyIGRpZmYgPSBnZXRQb2ludHNEaWZmKHBvaW50QiwgcG9pbnRBKTtcbiAgICB2YXIgY2VudGVyID0geyB4OiBwb2ludEEueCArIGRpZmYueCAvIDIsIHk6IHBvaW50QS55ICsgZGlmZi55IC8gMiB9O1xuICAgIHZhciBQID0gcm90YXRlKHBvaW50QiwgY2VudGVyLCBNYXRoLlBJIC8gMik7XG4gICAgdmFyIEQgPSB7IHg6IFAueCArIChjb250cm9sLnggLSBQLngpIC8gMiwgeTogUC55ICsgKGNvbnRyb2wueSAtIFAueSkgLyAyIH07XG4gICAgdmFyIHJhZGl1cyA9IGdldFBvaW50c0Rpc3RhbmNlKEQsIGNlbnRlcik7XG4gICAgdmFyIFUgPSB0cmFuc2xhdGVQb2ludChELCBnZXRQb2ludHNBbmdsZShELCBQKSwgcmFkaXVzKTtcbiAgICB2YXIgViA9IHRyYW5zbGF0ZVBvaW50KEQsIGdldFBvaW50c0FuZ2xlKEQsIGNvbnRyb2wpLCByYWRpdXMpO1xuICAgIHJldHVybiBbXG4gICAgICAgIHJvdW5kKGdldFBvaW50c0Rpc3RhbmNlKGNvbnRyb2wsIFUpLCBERUNJTUFMUyksXG4gICAgICAgIHJvdW5kKGdldFBvaW50c0Rpc3RhbmNlKGNvbnRyb2wsIFYpLCBERUNJTUFMUyksXG4gICAgICAgIHJvdW5kKGdldFBvaW50c0FuZ2xlKGNlbnRlciwgVikgKiAxODAgLyBNYXRoLlBJLCBERUNJTUFMUylcbiAgICBdO1xufTtcbnZhciByYW5kb21JZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpOyB9O1xuZXhwb3J0IHZhciB1dWlkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gQXJyYXkuZnJvbShBcnJheSgzKSkubWFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJhbmRvbUlkKCk7IH0pLmpvaW4oJy0nKTsgfTtcbiIsInZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IFBsYW5lVmlldywgQXhpcywgUk9UXzQ1LCBST1RfNjAsIFJPVF9DTUEgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IHNpbmNvcywgcmFkaWFuIH0gZnJvbSAnQHV0aWxzL21hdGgnO1xudmFyIG11bHRpcGx5TWF0cml4ID0gZnVuY3Rpb24gKG0xLCBtMikgeyByZXR1cm4gKG0xLm1hcChmdW5jdGlvbiAocm93LCBpKSB7IHJldHVybiAobTJbMF0ubWFwKGZ1bmN0aW9uIChfLCBqKSB7XG4gICAgcmV0dXJuIHJvdy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgXywgbikge1xuICAgICAgICByZXR1cm4gYWNjICsgbTFbaV1bbl0gKiBtMltuXVtqXTtcbiAgICB9LCAwKTtcbn0pKTsgfSkpOyB9O1xudmFyIG11bHRpcGx5TWF0cmljZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG0gPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBtW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBtYXRyaXggPSBtWzBdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXRyaXggPSBtdWx0aXBseU1hdHJpeChtYXRyaXgsIG1baV0pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0cml4O1xufTtcbnZhciByb3RhdGVYID0gZnVuY3Rpb24gKHIpIHtcbiAgICB2YXIgc2MgPSBzaW5jb3Mocik7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgWzEsIDAsIDBdLFxuICAgICAgICBbMCwgc2MuY29zLCAtc2Muc2luXSxcbiAgICAgICAgWzAsIHNjLnNpbiwgc2MuY29zXVxuICAgIF07XG59O1xudmFyIHJvdGF0ZVkgPSBmdW5jdGlvbiAocikge1xuICAgIHZhciBzYyA9IHNpbmNvcyhyKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBbc2MuY29zLCAwLCBzYy5zaW5dLFxuICAgICAgICBbMCwgMSwgMF0sXG4gICAgICAgIFstc2Muc2luLCAwLCBzYy5jb3NdXG4gICAgXTtcbn07XG52YXIgcm90YXRlWiA9IGZ1bmN0aW9uIChyKSB7XG4gICAgdmFyIHNjID0gc2luY29zKHIpO1xuICAgIHJldHVybiBbXG4gICAgICAgIFtzYy5jb3MsIC1zYy5zaW4sIDBdLFxuICAgICAgICBbc2Muc2luLCBzYy5jb3MsIDBdLFxuICAgICAgICBbMCwgMCwgMV1cbiAgICBdO1xufTtcbnZhciB0b3BNYXRyaXggPSBtdWx0aXBseU1hdHJpY2VzKHJvdGF0ZVgoUk9UX0NNQSksIHJvdGF0ZVooLVJPVF80NSkpO1xudmFyIGZyb250TWF0cml4ID0gbXVsdGlwbHlNYXRyaWNlcyhyb3RhdGVaKC1ST1RfNjApLCByb3RhdGVYKFJPVF9DTUEpLCByb3RhdGVaKFJPVF80NSkpO1xudmFyIHNpZGVNYXRyaXggPSBtdWx0aXBseU1hdHJpY2VzKHJvdGF0ZVooUk9UXzYwKSwgcm90YXRlWChST1RfQ01BKSwgcm90YXRlWigtUk9UXzQ1KSk7XG52YXIgcm90YXRpb25Ub1JvdGF0aW9uTWF0cml4ID0gZnVuY3Rpb24gKHZpZXcsIHJvdGF0aW9uKSB7XG4gICAgdmFyIHZhbHVlID0gcmFkaWFuKHJvdGF0aW9uLnZhbHVlKTtcbiAgICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAgICAgY2FzZSBQbGFuZVZpZXcuVE9QOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJvdGF0aW9uLmF4aXMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEF4aXMuVE9QOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm90YXRlWih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBBeGlzLkxFRlQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3RhdGVYKC12YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBBeGlzLlJJR0hUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm90YXRlWSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQbGFuZVZpZXcuRlJPTlQ6IHtcbiAgICAgICAgICAgIHN3aXRjaCAocm90YXRpb24uYXhpcykge1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5UT1A6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3RhdGVZKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIEF4aXMuTEVGVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVgodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5SSUdIVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVoodmFsdWUpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGxhbmVWaWV3LlNJREU6IHtcbiAgICAgICAgICAgIHN3aXRjaCAocm90YXRpb24uYXhpcykge1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5UT1A6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3RhdGVZKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIEF4aXMuTEVGVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVoodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgQXhpcy5SSUdIVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVgoLXZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgZ2V0Vmlld01hdHJpeCA9IGZ1bmN0aW9uIChwbGFuZVZpZXcsIHJvdGF0aW9uKSB7XG4gICAgdmFyIHJvdGF0aW9uTWF0cmljZXMgPSBbXTtcbiAgICB2YXIgcm90YXRpb25NYXRyaXggPSByb3RhdGlvblxuICAgICAgICA/IHJvdGF0aW9uVG9Sb3RhdGlvbk1hdHJpeChwbGFuZVZpZXcsIHJvdGF0aW9uKVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKHJvdGF0aW9uTWF0cml4KVxuICAgICAgICByb3RhdGlvbk1hdHJpY2VzLnB1c2gocm90YXRpb25NYXRyaXgpO1xuICAgIHN3aXRjaCAocGxhbmVWaWV3KSB7XG4gICAgICAgIGNhc2UgUGxhbmVWaWV3LlRPUDoge1xuICAgICAgICAgICAgcmV0dXJuIG11bHRpcGx5TWF0cmljZXMuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFt0b3BNYXRyaXhdLCByb3RhdGlvbk1hdHJpY2VzLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGxhbmVWaWV3LkZST05UOiB7XG4gICAgICAgICAgICByZXR1cm4gbXVsdGlwbHlNYXRyaWNlcy5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2Zyb250TWF0cml4XSwgcm90YXRpb25NYXRyaWNlcywgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFBsYW5lVmlldy5TSURFOiB7XG4gICAgICAgICAgICByZXR1cm4gbXVsdGlwbHlNYXRyaWNlcy5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW3NpZGVNYXRyaXhdLCByb3RhdGlvbk1hdHJpY2VzLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbiIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBDT01NQU5EU19SRUdFWFAsIENvbW1hbmQsIERFQ0lNQUxTLCBTQ0FMRSB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0UG9pbnRGcm9tSXNvbWV0cmljUG9pbnQsIGdldEVsbGlwc2lzU3BlY3MsIGdldE9yaWVudGF0aW9uLCByb3VuZCB9IGZyb20gJ0B1dGlscy9tYXRoJztcbmltcG9ydCB7IGdldFZpZXdNYXRyaXggfSBmcm9tICdAdXRpbHMvbWF0cml4JztcbmV4cG9ydCB2YXIgYWRkU1ZHUHJvcGVydGllcyA9IGZ1bmN0aW9uIChzdmcsIHByb3BzKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsIHByb3AsIHByb3BzW3Byb3BdKTtcbiAgICB9KTtcbn07XG52YXIgZ2V0Q29tbWFuZHNXaXRoU3RhcnQgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgICByZXR1cm4gY29tbWFuZHMubGVuZ3RoID09PSAwIHx8IGNvbW1hbmRzWzBdLmNvbW1hbmQgPT09IENvbW1hbmQubW92ZVxuICAgICAgICA/IF9fc3ByZWFkQXJyYXkoW10sIGNvbW1hbmRzLCB0cnVlKSA6IF9fc3ByZWFkQXJyYXkoW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICBwb2ludDogeyByOiAwLCBsOiAwLCB0OiAwIH1cbiAgICAgICAgfVxuICAgIF0sIGNvbW1hbmRzLCB0cnVlKTtcbn07XG5leHBvcnQgdmFyIGdldFNWR1BhdGggPSBmdW5jdGlvbiAoY29tbWFuZHMsIGNlbnRlclgsIGNlbnRlclksIHNjYWxlLCBhdXRvY2xvc2UpIHtcbiAgICB2YXIgZHJhd0NvbW1hbmRzID0gZ2V0Q29tbWFuZHNXaXRoU3RhcnQoY29tbWFuZHMpO1xuICAgIHZhciBzdmdQYXRocyA9IGRyYXdDb21tYW5kcy5tYXAoZnVuY3Rpb24gKGMsIGluZGV4KSB7XG4gICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGMucG9pbnQsIHNjYWxlKTtcbiAgICAgICAgc3dpdGNoIChjLmNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZC5tb3ZlOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIk1cIi5jb25jYXQocG9pbnQueCwgXCIgXCIpLmNvbmNhdChwb2ludC55KTtcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZC5saW5lOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIkxcIi5jb25jYXQocG9pbnQueCwgXCIgXCIpLmNvbmNhdChwb2ludC55KTtcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZC5jdXJ2ZToge1xuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGNvbW1hbmRzW2luZGV4IC0gMV0ucG9pbnQsIHNjYWxlKTtcbiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGMuY29udHJvbCwgc2NhbGUpO1xuICAgICAgICAgICAgICAgIHZhciBlbGxpcHNpc1NwZWNzID0gZ2V0RWxsaXBzaXNTcGVjcyhzdGFydCwgcG9pbnQsIGNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIHZhciBzd2VlcEZsYWcgPSBnZXRPcmllbnRhdGlvbihzdGFydCwgY29udHJvbCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkEgXCIuY29uY2F0KGVsbGlwc2lzU3BlY3NbMF0sIFwiIFwiKS5jb25jYXQoZWxsaXBzaXNTcGVjc1sxXSwgXCIgXCIpLmNvbmNhdChlbGxpcHNpc1NwZWNzWzJdLCBcIiAwIFwiKS5jb25jYXQoc3dlZXBGbGFnLCBcIiBcIikuY29uY2F0KHBvaW50LngsIFwiIFwiKS5jb25jYXQocG9pbnQueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc3ZnUGF0aHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoRW5kID0gYXV0b2Nsb3NlID8gJ3onIDogJyc7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChzdmdQYXRocy5qb2luKCcgJykudHJpbSgpKS5jb25jYXQocGF0aEVuZCk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5leHBvcnQgdmFyIHBhcnNlRHJhd0NvbW1hbmRzID0gZnVuY3Rpb24gKGNvbW1hbmRzKSB7XG4gICAgdmFyIGNvbW1hbmRzQXJyYXkgPSBbXTtcbiAgICB2YXIgYXJyYXk7XG4gICAgd2hpbGUgKChhcnJheSA9IENPTU1BTkRTX1JFR0VYUC5leGVjKGNvbW1hbmRzKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNvbW1hbmQgPSBhcnJheVs1XSB8fCBhcnJheVsxXTtcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjb21tYW5kc0FycmF5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6ICthcnJheVsyXSwgbDogK2FycmF5WzNdLCB0OiArYXJyYXlbNF0gfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgY29tbWFuZHNBcnJheS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5saW5lLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiArYXJyYXlbMl0sIGw6ICthcnJheVszXSwgdDogK2FycmF5WzRdIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzQXJyYXkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHsgcjogK2FycmF5WzZdLCBsOiArYXJyYXlbN10sIHQ6ICthcnJheVs4XSB9LFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiArYXJyYXlbOV0sIGw6ICthcnJheVsxMF0sIHQ6ICthcnJheVsxMV0gfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kc0FycmF5O1xufTtcbmV4cG9ydCB2YXIgdHJhbnNsYXRlQ29tbWFuZFBvaW50cyA9IGZ1bmN0aW9uIChjb21tYW5kcywgcmlnaHQsIGxlZnQsIHRvcCkge1xuICAgIGNvbW1hbmRzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1hbmQpIHtcbiAgICAgICAgY29tbWFuZC5wb2ludC5yICs9IHJpZ2h0O1xuICAgICAgICBjb21tYW5kLnBvaW50LmwgKz0gbGVmdDtcbiAgICAgICAgY29tbWFuZC5wb2ludC50ICs9IHRvcDtcbiAgICAgICAgaWYgKGNvbW1hbmQuY29udHJvbCkge1xuICAgICAgICAgICAgY29tbWFuZC5jb250cm9sLnIgKz0gcmlnaHQ7XG4gICAgICAgICAgICBjb21tYW5kLmNvbnRyb2wubCArPSBsZWZ0O1xuICAgICAgICAgICAgY29tbWFuZC5jb250cm9sLnQgKz0gdG9wO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuZXhwb3J0IHZhciBnZXRUZXh0dXJlQ29ybmVyID0gZnVuY3Rpb24gKGNvbW1hbmRzLCBjZW50ZXJYLCBjZW50ZXJZLCBzY2FsZSkge1xuICAgIHZhciBjb3JuZXIgPSB7XG4gICAgICAgIHg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICB5OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIH07XG4gICAgZ2V0Q29tbWFuZHNXaXRoU3RhcnQoY29tbWFuZHMpXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KGNlbnRlclgsIGNlbnRlclksIGMucG9pbnQsIHNjYWxlKTtcbiAgICAgICAgaWYgKHBvaW50LnggPCBjb3JuZXIueCB8fFxuICAgICAgICAgICAgKHBvaW50LnggPT09IGNvcm5lci54ICYmXG4gICAgICAgICAgICAgICAgcG9pbnQueSA8IGNvcm5lci55KSkge1xuICAgICAgICAgICAgY29ybmVyLnggPSBwb2ludC54O1xuICAgICAgICAgICAgY29ybmVyLnkgPSBwb2ludC55O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvcm5lcjtcbn07XG5leHBvcnQgdmFyIGlzU1ZHUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAnZmlsbENvbG9yJyxcbiAgICAgICAgJ2ZpbGxPcGFjaXR5JyxcbiAgICAgICAgJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgJ3N0cm9rZU9wYWNpdHknLFxuICAgICAgICAnc3Ryb2tlV2lkdGgnXG4gICAgXS5pbmNsdWRlcyhwcm9wZXJ0eSk7XG59O1xuZXhwb3J0IHZhciBnZXRTVkdQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGxDb2xvcjogJ2ZpbGwnLFxuICAgICAgICBmaWxsT3BhY2l0eTogJ2ZpbGwtb3BhY2l0eScsXG4gICAgICAgIHN0cm9rZUNvbG9yOiAnc3Ryb2tlJyxcbiAgICAgICAgc3Ryb2tlT3BhY2l0eTogJ3N0cm9rZS1vcGFjaXR5JyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6ICdzdHJva2Utd2lkdGgnXG4gICAgfVtwcm9wZXJ0eV07XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJUb0VsZW1lbnQoZWxlbWVudCwgbGlzdGVuZXJzLCBldmVudCwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB7XG4gICAgICAgIGZuOiBjYWxsYmFjayxcbiAgICAgICAgZm5CaW5kOiBjYWxsYmFjay5iaW5kKHRoaXMpXG4gICAgfTtcbiAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lci5mbkJpbmQsIHVzZUNhcHR1cmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tRWxlbWVudChlbGVtZW50LCBsaXN0ZW5lcnMsIGV2ZW50LCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBsaXN0ZW5lcjtcbiAgICBsaXN0ZW5lcnMuZmluZChmdW5jdGlvbiAobG4sIGluZGV4KSB7XG4gICAgICAgIGlmIChsbi5mbiA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLmZuQmluZCwgdXNlQ2FwdHVyZSk7XG4gICAgfVxufVxuZXhwb3J0IHZhciBnZXRQYXR0ZXJuVHJhbnNmb3JtID0gZnVuY3Rpb24gKGNvcm5lciwgcGxhbmVWaWV3LCBzY2FsZSwgcm90YXRpb24pIHtcbiAgICB2YXIgbWF0cml4ID0gZ2V0Vmlld01hdHJpeChwbGFuZVZpZXcsIHJvdGF0aW9uKTtcbiAgICB2YXIgdHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGNvcm5lci54LCBcIiBcIikuY29uY2F0KGNvcm5lci55LCBcIilcIik7XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgICB2YXIgbTEgPSByb3VuZChtYXRyaXhbMF1bMF0sIERFQ0lNQUxTKTtcbiAgICAgICAgdmFyIG0yID0gcm91bmQobWF0cml4WzFdWzBdLCBERUNJTUFMUyk7XG4gICAgICAgIHZhciBtMyA9IHJvdW5kKG1hdHJpeFswXVsxXSwgREVDSU1BTFMpO1xuICAgICAgICB2YXIgbTQgPSByb3VuZChtYXRyaXhbMV1bMV0sIERFQ0lNQUxTKTtcbiAgICAgICAgdHJhbnNmb3JtICs9IFwiIG1hdHJpeChcIi5jb25jYXQobTEsIFwiLFwiKS5jb25jYXQobTIsIFwiLFwiKS5jb25jYXQobTMsIFwiLFwiKS5jb25jYXQobTQsIFwiLDAsMClcIik7XG4gICAgICAgIHRyYW5zZm9ybSArPSBcIiBzY2FsZShcIi5jb25jYXQocm91bmQoU0NBTEUgKiAoc2NhbGUgfHwgMSksIERFQ0lNQUxTKSwgXCIpXCIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2FsZSkge1xuICAgICAgICB0cmFuc2Zvcm0gKz0gXCIgc2NhbGUoXCIuY29uY2F0KHJvdW5kKHNjYWxlLCBERUNJTUFMUyksIFwiKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybTtcbn07XG5leHBvcnQgdmFyIGVsZW1lbnRIYXNTVkdQYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnU1ZHU1ZHRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50SGFzU1ZHUGFyZW50KGVsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgdmFyIGdldEFuaW1hdGlvblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZ2V0UGF0aCwgYW5pbWF0aW9uLCBwcm9wcykge1xuICAgIHZhciBwcm9wZXJ0aWVzO1xuICAgIHZhciBsb2NhbEdldFBhdGggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wcyksIChfYSA9IHt9LCBfYVthbmltYXRpb24ucHJvcGVydHldID0gK3ZhbHVlLCBfYSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0UGF0aCh2YWx1ZSk7XG4gICAgfTtcbiAgICBpZiAoYW5pbWF0aW9uLnZhbHVlcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbmltYXRpb24udmFsdWVzKSkge1xuICAgICAgICAgICAgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGFuaW1hdGlvbi52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHZXRQYXRoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCc7JylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlczogbG9jYWxHZXRQYXRoKGFuaW1hdGlvbi52YWx1ZXMpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgZnJvbTogbG9jYWxHZXRQYXRoKGFuaW1hdGlvbi5mcm9tKSxcbiAgICAgICAgICAgIHRvOiBsb2NhbEdldFBhdGgoYW5pbWF0aW9uLnRvKVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydGllcztcbn07XG4iLCJ2YXIgU3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0b3JlKHdpZHRoLCBoZWlnaHQsIHNjYWxlKSB7XG4gICAgICAgIHRoaXMuc2l6ZXMgPSB7XG4gICAgICAgICAgICBjZW50ZXJYOiB3aWR0aCAvIDIsXG4gICAgICAgICAgICBjZW50ZXJZOiBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBzY2FsZTogc2NhbGVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0b3JlLnByb3RvdHlwZSwgXCJ3aWR0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZXMud2lkdGg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNpemVzLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNpemVzLmNlbnRlclggPSB2YWx1ZSAvIDI7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RvcmUucHJvdG90eXBlLCBcImhlaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZXMuaGVpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zaXplcy5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZXMuY2VudGVyWSA9IHZhbHVlIC8gMjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdG9yZS5wcm90b3R5cGUsIFwic2NhbGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpemVzLnNjYWxlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zaXplcy5zY2FsZSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0b3JlLnByb3RvdHlwZSwgXCJjZW50ZXJYXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaXplcy5jZW50ZXJYO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0b3JlLnByb3RvdHlwZSwgXCJjZW50ZXJZXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaXplcy5jZW50ZXJZO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIFN0b3JlO1xufSgpKTtcbmV4cG9ydCB7IFN0b3JlIH07XG4iLCJ2YXIgSXNvbWV0cmljU3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1N0b3JlKCkge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljU3RvcmUucHJvdG90eXBlLCBcImRhdGFcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTdG9yZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVN0b3JlID0gc3RvcmU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gSXNvbWV0cmljU3RvcmU7XG59KCkpO1xuZXhwb3J0IHsgSXNvbWV0cmljU3RvcmUgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY1N0b3JlIH0gZnJvbSAnLi9Jc29tZXRyaWNTdG9yZSc7XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuaW1wb3J0IHsgU1ZHX05BTUVTUEFDRSB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgSXNvbWV0cmljU3RvcmUgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTdG9yZSc7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBhZGRFdmVudExpc3RlbmVyVG9FbGVtZW50LCByZW1vdmVFdmVudExpc3RlbmVyRnJvbUVsZW1lbnQgfSBmcm9tICdAdXRpbHMvc3ZnJztcbnZhciBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljRWxlbWVudEFic3RyYWN0KGlkLCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9pZCA9IGlkO1xuICAgICAgICBfdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgX3RoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBzdmdFbGVtZW50KTtcbiAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhfdGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAnaWQnOiBfdGhpcy5faWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljRWxlbWVudEFic3RyYWN0LnByb3RvdHlwZS5zZXRJZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwge1xuICAgICAgICAgICAgJ2lkJzogdGhpcy5faWRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gICAgfTtcbiAgICBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgIGlmICh1c2VDYXB0dXJlID09PSB2b2lkIDApIHsgdXNlQ2FwdHVyZSA9IGZhbHNlOyB9XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXJUb0VsZW1lbnQuY2FsbCh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMubGlzdGVuZXJzLCBldmVudCwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICAgICAgaWYgKHVzZUNhcHR1cmUgPT09IHZvaWQgMCkgeyB1c2VDYXB0dXJlID0gZmFsc2U7IH1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21FbGVtZW50KHRoaXMuZWxlbWVudCwgdGhpcy5saXN0ZW5lcnMsIGV2ZW50LCBjYWxsYmFjaywgdXNlQ2FwdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdDtcbn0oSXNvbWV0cmljU3RvcmUpKTtcbmV4cG9ydCB7IElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdCB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljRWxlbWVudEFic3RyYWN0IH0gZnJvbSAnLi9Jc29tZXRyaWNFbGVtZW50QWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBDb2xvcnMsIExpbmVDYXAsIExpbmVKb2luLCBERUNJTUFMUywgU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBnZXRTVkdQcm9wZXJ0eSwgZ2V0UGF0dGVyblRyYW5zZm9ybSwgaXNTVkdQcm9wZXJ0eSwgZ2V0QW5pbWF0aW9uUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgdXVpZCwgcm91bmQsIGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50IH0gZnJvbSAnQHV0aWxzL21hdGgnO1xuaW1wb3J0IHsgSXNvbWV0cmljRWxlbWVudEFic3RyYWN0IH0gZnJvbSAnLi4vSXNvbWV0cmljRWxlbWVudEFic3RyYWN0JztcbnZhciBkZWZhdWx0T2JqZWN0UHJvcHMgPSB7XG4gICAgZmlsbENvbG9yOiBDb2xvcnMud2hpdGUsXG4gICAgZmlsbE9wYWNpdHk6IDEsXG4gICAgc3Ryb2tlQ29sb3I6IENvbG9ycy5ibGFjayxcbiAgICBzdHJva2VEYXNoQXJyYXk6IFtdLFxuICAgIHN0cm9rZUxpbmVjYXA6IExpbmVDYXAuYnV0dCxcbiAgICBzdHJva2VMaW5lam9pbjogTGluZUpvaW4ucm91bmQsXG4gICAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgICBzdHJva2VXaWR0aDogMVxufTtcbnZhciBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0KHByb3BzLCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLmlkIHx8IHV1aWQoKSwgc3ZnRWxlbWVudCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdE9iamVjdFByb3BzKSwgcHJvcHMpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25zID0gW107XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICBfdGhpcy5jcmVhdGVUZXh0dXJlKF90aGlzLnByb3BzLnRleHR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoX3RoaXMuZWxlbWVudCwgX19hc3NpZ24oeyAnZmlsbCc6IF90aGlzLnByb3BzLnRleHR1cmVcbiAgICAgICAgICAgICAgICA/IFwidXJsKCNcIi5jb25jYXQoX3RoaXMucGF0dGVybklkLCBcIikgXCIpLmNvbmNhdChfdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgOiBfdGhpcy5maWxsQ29sb3IsICdmaWxsLW9wYWNpdHknOiBcIlwiLmNvbmNhdChfdGhpcy5maWxsT3BhY2l0eSksICdzdHJva2UnOiBfdGhpcy5zdHJva2VDb2xvciwgJ3N0cm9rZS1kYXNoYXJyYXknOiBfdGhpcy5zdHJva2VEYXNoQXJyYXkuam9pbignICcpLCAnc3Ryb2tlLWxpbmVjYXAnOiBfdGhpcy5zdHJva2VMaW5lY2FwLCAnc3Ryb2tlLWxpbmVqb2luJzogX3RoaXMuc3Ryb2tlTGluZWpvaW4sICdzdHJva2Utb3BhY2l0eSc6IFwiXCIuY29uY2F0KF90aGlzLnN0cm9rZU9wYWNpdHkpLCAnc3Ryb2tlLXdpZHRoJzogXCJcIi5jb25jYXQoX3RoaXMuc3Ryb2tlV2lkdGgpIH0sIChfdGhpcy5wcm9wcy5jbGFzc05hbWUgJiYge1xuICAgICAgICAgICAgY2xhc3M6IF90aGlzLnByb3BzLmNsYXNzTmFtZVxuICAgICAgICB9KSkpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUuY3JlYXRlVGV4dHVyZSA9IGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMucGF0dGVybklkID0gXCJcIi5jb25jYXQodGhpcy5pZCwgXCJfX3RleHR1cmVcIik7XG4gICAgICAgIHRoaXMucGF0dGVybiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMucGF0dGVybik7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5wYXR0ZXJuLCB7XG4gICAgICAgICAgICAnaWQnOiB0aGlzLnBhdHRlcm5JZCxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJzogJ25vbmUnLFxuICAgICAgICAgICAgJ3BhdHRlcm5Vbml0cyc6ICd1c2VyU3BhY2VPblVzZSdcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMuaW1hZ2UpO1xuICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKGltYWdlLCB7XG4gICAgICAgICAgICAnaHJlZic6IHRleHR1cmUudXJsLFxuICAgICAgICAgICAgJ3gnOiAnMCcsXG4gICAgICAgICAgICAneSc6ICcwJyxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJzogJ25vbmUnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGV4dHVyZS5waXhlbGF0ZWQpIHtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoaW1hZ2UsIHtcbiAgICAgICAgICAgICAgICAnc3R5bGUnOiAnaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdHRlcm4uYXBwZW5kQ2hpbGQoaW1hZ2UpO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS5fdXBkYXRlVGV4dHVyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGltYWdlID0gdGhpcy5wYXR0ZXJuLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnRleHR1cmUudXJsICYmXG4gICAgICAgICAgICBpbWFnZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSAhPT0gdGhpcy5wcm9wcy50ZXh0dXJlLnVybCkge1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhpbWFnZSwge1xuICAgICAgICAgICAgICAgICdocmVmJzogdGhpcy5wcm9wcy50ZXh0dXJlLnVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMudGV4dHVyZS5waXhlbGF0ZWQpIHtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoaW1hZ2UsIHtcbiAgICAgICAgICAgICAgICAnc3R5bGUnOiAnaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS5hZGRBbmltYXRpb25CYXNpY1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSwgYW5pbWF0aW9uKSB7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHtcbiAgICAgICAgICAgIHJlcGVhdENvdW50OiBcIlwiLmNvbmNhdChhbmltYXRpb24ucmVwZWF0IHx8ICdpbmRlZmluaXRlJyksXG4gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgZHVyOiBcIlwiLmNvbmNhdChhbmltYXRpb24uZHVyYXRpb24gfHwgMSwgXCJzXCIpXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS51cGRhdGVBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChpc05hdGl2ZVNWR1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gZ2V0U1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUy5hbmltYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5pbWF0aW9uLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5hZGRBbmltYXRpb25CYXNpY1Byb3BlcnRpZXMocHJvcGVydHksIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBnZXRBbmltYXRpb25Qcm9wZXJ0aWVzKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gXCJcIi5jb25jYXQodmFsdWUpOyB9LCBhbmltYXRpb24pO1xuICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVTdWJDbGFzc0FuaW1hdGlvbnMoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUudXBkYXRlUGF0dGVyblRyYW5zZm9ybSA9IGZ1bmN0aW9uIChjb3JuZXIsIHBsYW5lVmlldykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudGV4dHVyZSkge1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMucHJvcHMudGV4dHVyZS5oZWlnaHRcbiAgICAgICAgICAgICAgICA/IFwiXCIuY29uY2F0KHRoaXMucHJvcHMudGV4dHVyZS5oZWlnaHQgKiB0aGlzLmRhdGEuc2NhbGUpXG4gICAgICAgICAgICAgICAgOiAnMTAwJSc7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLnByb3BzLnRleHR1cmUud2lkdGhcbiAgICAgICAgICAgICAgICA/IFwiXCIuY29uY2F0KHRoaXMucHJvcHMudGV4dHVyZS53aWR0aCAqIHRoaXMuZGF0YS5zY2FsZSlcbiAgICAgICAgICAgICAgICA6ICcxMDAlJztcbiAgICAgICAgICAgIHZhciBzaGlmdCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KDAsIDAsIHtcbiAgICAgICAgICAgICAgICByOiAoKF9hID0gdGhpcy5wcm9wcy50ZXh0dXJlLnNoaWZ0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmlnaHQpIHx8IDAsXG4gICAgICAgICAgICAgICAgbDogKChfYiA9IHRoaXMucHJvcHMudGV4dHVyZS5zaGlmdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmxlZnQpIHx8IDAsXG4gICAgICAgICAgICAgICAgdDogKChfYyA9IHRoaXMucHJvcHMudGV4dHVyZS5zaGlmdCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvcCkgfHwgMFxuICAgICAgICAgICAgfSwgdGhpcy5kYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm0gPSBnZXRQYXR0ZXJuVHJhbnNmb3JtKHtcbiAgICAgICAgICAgICAgICB4OiByb3VuZChjb3JuZXIueCArIHNoaWZ0LngsIERFQ0lNQUxTKSxcbiAgICAgICAgICAgICAgICB5OiByb3VuZChjb3JuZXIueSArIHNoaWZ0LnksIERFQ0lNQUxTKVxuICAgICAgICAgICAgfSwgdGhpcy5wcm9wcy50ZXh0dXJlLnBsYW5lVmlldyB8fCBwbGFuZVZpZXcsIHRoaXMucHJvcHMudGV4dHVyZS5zY2FsZSwgdGhpcy5wcm9wcy50ZXh0dXJlLnJvdGF0aW9uKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5wYXR0ZXJuLCB7XG4gICAgICAgICAgICAgICAgJ3BhdHRlcm5UcmFuc2Zvcm0nOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiB3aWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMucGF0dGVybi5maXJzdENoaWxkLCB7XG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiB3aWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLCBcImlkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldElkKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5JZCA9IFwiXCIuY29uY2F0KHRoaXMuaWQsIFwiX190ZXh0dXJlXCIpO1xuICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5wYXR0ZXJuLCB7XG4gICAgICAgICAgICAgICAgICAgICdpZCc6IHRoaXMucGF0dGVybklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJmaWxsQ29sb3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLmZpbGxDb2xvcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuZmlsbENvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwge1xuICAgICAgICAgICAgICAgICdmaWxsJzogdGhpcy5wcm9wcy50ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgID8gXCJ1cmwoI1wiLmNvbmNhdCh0aGlzLnBhdHRlcm5JZCwgXCIpIFwiKS5jb25jYXQodGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5maWxsQ29sb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwiZmlsbE9wYWNpdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLmZpbGxPcGFjaXR5O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5maWxsT3BhY2l0eSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ2ZpbGwtb3BhY2l0eSc6IFwiXCIuY29uY2F0KHRoaXMuZmlsbE9wYWNpdHkpIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwidGV4dHVyZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudGV4dHVyZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBoYXNUZXh0dXJlID0gISF0aGlzLnByb3BzLnRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHR1cmUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChoYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUZXh0dXJlKHRoaXMucHJvcHMudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLCBcInN0cm9rZUNvbG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VDb2xvcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc3Ryb2tlQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7ICdzdHJva2UnOiB0aGlzLnN0cm9rZUNvbG9yIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwic3Ryb2tlRGFzaEFycmF5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VEYXNoQXJyYXk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnN0cm9rZURhc2hBcnJheSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ3N0cm9rZS1kYXNoYXJyYXknOiB0aGlzLnN0cm9rZURhc2hBcnJheS5qb2luKCcgJykgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJzdHJva2VMaW5lY2FwXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VMaW5lY2FwO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VMaW5lY2FwID0gTGluZUNhcFt2YWx1ZV07XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwgeyAnc3Ryb2tlLWxpbmVjYXAnOiB0aGlzLnN0cm9rZUxpbmVjYXAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJzdHJva2VMaW5lam9pblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc3Ryb2tlTGluZWpvaW47XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnN0cm9rZUxpbmVqb2luID0gTGluZUpvaW5bdmFsdWVdO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ3N0cm9rZS1saW5lam9pbic6IHRoaXMuc3Ryb2tlTGluZWpvaW4gfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZSwgXCJzdHJva2VPcGFjaXR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zdHJva2VPcGFjaXR5O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VPcGFjaXR5ID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwgeyAnc3Ryb2tlLW9wYWNpdHknOiBcIlwiLmNvbmNhdCh0aGlzLnN0cm9rZU9wYWNpdHkpIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwic3Ryb2tlV2lkdGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLnN0cm9rZVdpZHRoO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VXaWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHsgJ3N0cm9rZS13aWR0aCc6IFwiXCIuY29uY2F0KHRoaXMuc3Ryb2tlV2lkdGgpIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUsIFwiY2xhc3NOYW1lXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jbGFzc05hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmNsYXNzTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAnY2xhc3MnOiB0aGlzLnByb3BzLmNsYXNzTmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLmdldFBhdHRlcm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm47XG4gICAgfTtcbiAgICBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QucHJvdG90eXBlLnVwZGF0ZVRleHR1cmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGhhc1RleHR1cmUgPSAhIXRoaXMucHJvcHMudGV4dHVyZTtcbiAgICAgICAgaWYgKGhhc1RleHR1cmUgfHwgdmFsdWUudXJsKSB7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSB2YWx1ZS5zaGlmdCwgcm90YXRpb24gPSB2YWx1ZS5yb3RhdGlvbiwgbmV3UHJvcHMgPSBfX3Jlc3QodmFsdWUsIFtcInNoaWZ0XCIsIFwicm90YXRpb25cIl0pO1xuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0dXJlID0gaGFzVGV4dHVyZVxuICAgICAgICAgICAgICAgID8gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMucHJvcHMudGV4dHVyZSksIG5ld1Byb3BzKSA6IF9fYXNzaWduKHt9LCBuZXdQcm9wcyk7XG4gICAgICAgICAgICBpZiAoc2hpZnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHR1cmUuc2hpZnQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgKHRoaXMucHJvcHMudGV4dHVyZS5zaGlmdCB8fCB7fSkpLCBzaGlmdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHR1cmUucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUZXh0dXJlKHRoaXMucHJvcHMudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUuYWRkQW5pbWF0aW9uID0gZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMucHVzaChfX2Fzc2lnbih7fSwgYW5pbWF0aW9uKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0LnByb3RvdHlwZS5yZW1vdmVBbmltYXRpb25CeUluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5hbmltYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5lbGVtZW50ICYmIGFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdC5wcm90b3R5cGUucmVtb3ZlQW5pbWF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFuaW1hdGlvbnMgPSB0aGlzLmFuaW1hdGlvbnMuc3BsaWNlKDApO1xuICAgICAgICBhbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5lbGVtZW50ICYmIGFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdDtcbn0oSXNvbWV0cmljRWxlbWVudEFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY0dyYXBoaWNBYnN0cmFjdCB9IGZyb20gJy4vSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0JztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5pbXBvcnQgeyBlbGVtZW50SGFzU1ZHUGFyZW50IH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG5pbXBvcnQgeyBJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNFbGVtZW50QWJzdHJhY3QnO1xuaW1wb3J0IHsgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0JztcbnZhciBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0KGlkLCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGlkLCBzdmdFbGVtZW50KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuZ2V0Q2hpbGRJbmRleCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUudGhyb3dDaGlsZEVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgcHJvdmlkZSBhIGNoaWxkIHRoYXQgaXMgbm90IGEgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lcicpO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZVNWR0NoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBzdmdDaGlsZCA9IGNoaWxkLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSXNvbWV0cmljR3JhcGhpY0Fic3RyYWN0KSB7XG4gICAgICAgICAgICB2YXIgc3ZnUGF0dGVybkNoaWxkID0gY2hpbGQuZ2V0UGF0dGVybigpO1xuICAgICAgICAgICAgaWYgKHN2Z1BhdHRlcm5DaGlsZCAmJiBzdmdQYXR0ZXJuQ2hpbGQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChzdmdQYXR0ZXJuQ2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdmdDaGlsZC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQoc3ZnQ2hpbGQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuaW5zZXJ0UGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHBhdHRlcm4sIHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZSwgXCJpZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJZCh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLCBcImNoaWxkcmVuXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZWxlbWVudEhhc1NWR1BhcmVudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkLmRhdGEgPSBfdGhpcy5kYXRhO1xuICAgICAgICAgICAgICAgIGNoaWxkLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuLnNwbGljZSgwKTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIF90aGlzLnJlbW92ZVNWR0NoaWxkKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkLmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0UGF0dGVybihjaGlsZC5nZXRQYXR0ZXJuKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZC5nZXRFbGVtZW50KCkpO1xuICAgICAgICBjaGlsZC51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuYWRkQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgY2hpbGRyZW5bX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gX3RoaXMuYWRkQ2hpbGQoY2hpbGQpOyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuZ2V0Q2hpbGRCeUluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbltpbmRleF0gfHwgbnVsbDtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5nZXRDaGlsZEJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5fY2hpbGRyZW4uZmluZChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLmlkID09PSBpZDsgfSk7XG4gICAgICAgIHJldHVybiBjaGlsZCB8fCBudWxsO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBjaGlsZEluZGV4ID0gdGhpcy5nZXRDaGlsZEluZGV4KGNoaWxkKTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTVkdDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRocm93Q2hpbGRFcnJvcigpO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGNoaWxkcmVuW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gX3RoaXMuZ2V0Q2hpbGRJbmRleChjaGlsZCk7XG4gICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkQnlJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5fY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU1ZHQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QucHJvdG90eXBlLnJlbW92ZUNoaWxkQnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChpZCk7XG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuc2V0Q2hpbGRJbmRleCA9IGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNoaWxkSW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBpbmRleCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGluZGV4KSwgdGhpcy5fY2hpbGRyZW4ubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB2YXIgbW92ZWRFbGVtZW50ID0gY2hpbGQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgdmFyIHJlcGxhY2VkRWxlbWVudCA9IHRoaXMuX2NoaWxkcmVuW2luZGV4XS5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW5baW5kZXhdICE9PSBjaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnNwbGljZShjaGlsZEluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUobW92ZWRFbGVtZW50LCByZXBsYWNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkRWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShtb3ZlZEVsZW1lbnQsIHJlcGxhY2VkRWxlbWVudC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQobW92ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyb3dDaGlsZEVycm9yKCk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdC5wcm90b3R5cGUuYnJpbmdDaGlsZFRvRnJvbnQgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkSW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNldENoaWxkSW5kZXgoY2hpbGQsIHRoaXMuX2NoaWxkcmVuLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5icmluZ0NoaWxkRm9yd2FyZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRoaXMuZ2V0Q2hpbGRJbmRleChjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZEluZGV4IDwgdGhpcy5fY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hpbGRJbmRleChjaGlsZCwgY2hpbGRJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5zZW5kQ2hpbGRUb0JhY2sgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkSW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNldENoaWxkSW5kZXgoY2hpbGQsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0LnByb3RvdHlwZS5zZW5kQ2hpbGRCYWNrd2FyZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRoaXMuZ2V0Q2hpbGRJbmRleChjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hpbGRJbmRleChjaGlsZCwgY2hpbGRJbmRleCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHJvd0NoaWxkRXJyb3IoKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdDtcbn0oSXNvbWV0cmljRWxlbWVudEFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QgfSBmcm9tICcuL0lzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0JztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuaW1wb3J0IHsgU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLCBTVkdfUFJPUEVSVElFUywgREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQsIENvbG9ycyB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkU1ZHUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJ0B1dGlscy9tYXRoJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQHN0b3JlJztcbmltcG9ydCB7IElzb21ldHJpY0NvbnRhaW5lckFic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QnO1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjb250YWluZXI6ICdib2R5JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IENvbG9ycy53aGl0ZSxcbiAgICBzY2FsZTogMSxcbiAgICBoZWlnaHQ6IERFRkFVTFRfSEVJR0hULFxuICAgIHdpZHRoOiBERUZBVUxUX1dJRFRIXG59O1xudmFyIElzb21ldHJpY0NhbnZhcyA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY0NhbnZhcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNDYW52YXMocHJvcHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocHJvcHMgPT09IHZvaWQgMCkgeyBwcm9wcyA9IHt9OyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLmlkIHx8IHV1aWQoKSwgU1ZHX0VMRU1FTlRTLnN2ZykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdFByb3BzKSwgcHJvcHMpO1xuICAgICAgICBfdGhpcy5pc0FuaW1hdGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGF0YSA9IG5ldyBTdG9yZShfdGhpcy5wcm9wcy53aWR0aCwgX3RoaXMucHJvcHMuaGVpZ2h0LCBfdGhpcy5wcm9wcy5zY2FsZSk7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoX3RoaXMuZWxlbWVudCwgKF9hID0ge30sXG4gICAgICAgICAgICBfYVtTVkdfUFJPUEVSVElFUy52aWV3Qm94XSA9IFwiMCAwIFwiLmNvbmNhdChfdGhpcy5kYXRhLndpZHRoLCBcIiBcIikuY29uY2F0KF90aGlzLmRhdGEuaGVpZ2h0KSxcbiAgICAgICAgICAgIF9hLndpZHRoID0gXCJcIi5jb25jYXQoX3RoaXMuZGF0YS53aWR0aCwgXCJweFwiKSxcbiAgICAgICAgICAgIF9hLmhlaWdodCA9IFwiXCIuY29uY2F0KF90aGlzLmRhdGEuaGVpZ2h0LCBcInB4XCIpLFxuICAgICAgICAgICAgX2EpKTtcbiAgICAgICAgX3RoaXMuYmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMucmVjdCk7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoX3RoaXMuYmFja2dyb3VuZCwge1xuICAgICAgICAgICAgZmlsbDogX3RoaXMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgeDogJzAnLFxuICAgICAgICAgICAgeTogJzAnLFxuICAgICAgICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KF90aGlzLmRhdGEud2lkdGgsIFwicHhcIiksXG4gICAgICAgICAgICBoZWlnaHQ6IFwiXCIuY29uY2F0KF90aGlzLmRhdGEuaGVpZ2h0LCBcInB4XCIpXG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKF90aGlzLmJhY2tncm91bmQpO1xuICAgICAgICB2YXIgY29udGFpbmVyRWxlbWVudCA9IHR5cGVvZiBfdGhpcy5wcm9wcy5jb250YWluZXIgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoX3RoaXMucHJvcHMuY29udGFpbmVyKVxuICAgICAgICAgICAgOiBfdGhpcy5wcm9wcy5jb250YWluZXI7XG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoX3RoaXMuZWxlbWVudCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0NhbnZhcy5wcm90b3R5cGUsIFwiYmFja2dyb3VuZENvbG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmJhY2tncm91bmRDb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmJhY2tncm91bmQsIHsgZmlsbDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZSwgXCJzY2FsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zY2FsZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zY2FsZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNDYW52YXMucHJvdG90eXBlLCBcImhlaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oZWlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICB0aGlzLmRhdGEuaGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuZWxlbWVudCwgKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbU1ZHX1BST1BFUlRJRVMudmlld0JveF0gPSBcIjAgMCBcIi5jb25jYXQodGhpcy5kYXRhLndpZHRoLCBcIiBcIikuY29uY2F0KHRoaXMuZGF0YS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIF9hLmhlaWdodCA9IFwiXCIuY29uY2F0KHRoaXMuZGF0YS5oZWlnaHQsIFwicHhcIiksXG4gICAgICAgICAgICAgICAgX2EpKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5iYWNrZ3JvdW5kLCB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBcIlwiLmNvbmNhdCh0aGlzLmRhdGEuaGVpZ2h0LCBcInB4XCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZSwgXCJ3aWR0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS53aWR0aDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS53aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIChfYSA9IHt9LFxuICAgICAgICAgICAgICAgIF9hW1NWR19QUk9QRVJUSUVTLnZpZXdCb3hdID0gXCIwIDAgXCIuY29uY2F0KHRoaXMuZGF0YS53aWR0aCwgXCIgXCIpLmNvbmNhdCh0aGlzLmRhdGEuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBfYS53aWR0aCA9IFwiXCIuY29uY2F0KHRoaXMuZGF0YS53aWR0aCwgXCJweFwiKSxcbiAgICAgICAgICAgICAgICBfYSkpO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmJhY2tncm91bmQsIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogXCJcIi5jb25jYXQodGhpcy5kYXRhLndpZHRoLCBcInB4XCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZSwgXCJhbmltYXRlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNBbmltYXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIElzb21ldHJpY0NhbnZhcy5wcm90b3R5cGUuZ2V0U1ZHQ29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vdXRlckhUTUw7XG4gICAgfTtcbiAgICBJc29tZXRyaWNDYW52YXMucHJvdG90eXBlLnBhdXNlQW5pbWF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN2ZyA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBzdmcucGF1c2VBbmltYXRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdmcucGF1c2VBbmltYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ2FudmFzLnByb3RvdHlwZS5yZXN1bWVBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3ZnID0gdGhpcy5lbGVtZW50O1xuICAgICAgICBpZiAodHlwZW9mIHN2Zy51bnBhdXNlQW5pbWF0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3ZnLnVucGF1c2VBbmltYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FuaW1hdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gSXNvbWV0cmljQ2FudmFzO1xufShJc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCkpO1xuZXhwb3J0IHsgSXNvbWV0cmljQ2FudmFzIH07XG4iLCJleHBvcnQgKiBmcm9tICcuL0lzb21ldHJpY0NhbnZhcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiIsImV4cG9ydCB2YXIgYXBwbHlNaXhpbnMgPSBmdW5jdGlvbiAoQmFzZUNsYXNzLCBjb25zdHJ1Y3Rvcikge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvbnN0cnVjdG9yLnByb3RvdHlwZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmFzZUNsYXNzLnByb3RvdHlwZSwgbmFtZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIG5hbWUpKTtcbiAgICB9KTtcbn07XG4iLCJleHBvcnQgdmFyIE5PX0xJTUlUUyA9IFtcbiAgICBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuXTtcbmV4cG9ydCB2YXIgRFJBR19FVkVOVDtcbihmdW5jdGlvbiAoRFJBR19FVkVOVCkge1xuICAgIERSQUdfRVZFTlRbXCJEUkFHX1NUQVJUXCJdID0gXCJkcmFnc3RhcnRcIjtcbiAgICBEUkFHX0VWRU5UW1wiRFJBR1wiXSA9IFwiZHJhZ1wiO1xuICAgIERSQUdfRVZFTlRbXCJEUkFHX0VORFwiXSA9IFwiZHJhZ2VuZFwiO1xufSkoRFJBR19FVkVOVCB8fCAoRFJBR19FVkVOVCA9IHt9KSk7XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IEVWRU5UUywgREVDSU1BTFMsIFBsYW5lVmlldywgVHlwZW9mIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRUb3BQbGFuZVBvaW50RnJvbUNvb3JkaW5hdGVzLCBnZXRGcm9udFBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMsIGdldFNpZGVQbGFuZVBvaW50RnJvbUNvb3JkaW5hdGVzLCByb3VuZCB9IGZyb20gJ0B1dGlscy9tYXRoJztcbmltcG9ydCB7IElzb21ldHJpY0VsZW1lbnRBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0VsZW1lbnRBYnN0cmFjdCc7XG5pbXBvcnQgeyBOT19MSU1JVFMsIERSQUdfRVZFTlQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG52YXIgX2lzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFR5cGVvZi5VTkRFRklORUQ7XG52YXIgX3JlcXVlc3RBbmltYXRpb25GcmFtZSA9IF9pc0Jyb3dzZXJcbiAgICA/ICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpXG4gICAgOiBudWxsO1xudmFyIF9kcmFnU3RvcmVEZWZhdWx0ID0ge1xuICAgIHJpZ2h0OiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwLFxuICAgIHg6IDAsXG4gICAgeTogMFxufTtcbnZhciBpc01vdXNlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuICdjbGllbnRYJyBpbiBldmVudDsgfTtcbnZhciBnZXRDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsaWVudFg6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICAgIGNsaWVudFk6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59O1xudmFyIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJ0RHJhZyA9IHRoaXMuc3RhcnREcmFnLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3RvcERyYWcgPSB0aGlzLnN0b3BEcmFnLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubW92ZUVsZW1lbnQgPSB0aGlzLm1vdmVFbGVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZHJvcEVsZW1lbnQgPSB0aGlzLmRyb3BFbGVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYW5pbWF0ZSA9IHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2JvdW5kcyA9PT0gVHlwZW9mLlVOREVGSU5FRCkge1xuICAgICAgICAgICAgdGhpcy5fYm91bmRzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9kcmFnU3RvcmUgPT09IFR5cGVvZi5VTkRFRklORUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYWdTdG9yZSA9IF9kcmFnU3RvcmVEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29vcmRzID09PSBUeXBlb2YuVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29yZHMgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmJldHdlZW5Cb3VuZHMgPSBmdW5jdGlvbiAodmFsdWUsIGJvdW5kcykge1xuICAgICAgICB2YXIgb3JkZXJlZEJvdW5kcyA9IF9fc3ByZWFkQXJyYXkoW10sIGJvdW5kcywgdHJ1ZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gcm91bmQoTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIG9yZGVyZWRCb3VuZHNbMF0pLCBvcmRlcmVkQm91bmRzWzFdKSwgREVDSU1BTFMpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmdldEJvdW5kT3JNYXhpbXVtID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmJvdW5kc1twcm9wXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogX19zcHJlYWRBcnJheShbXSwgTk9fTElNSVRTLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheShbXSwgTk9fTElNSVRTLCB0cnVlKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5nZXRCb3VuZE9yTWF4aW11bSgncmlnaHQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmV0d2VlbkJvdW5kcyh0aGlzLl9kcmFnU3RvcmUucmlnaHQgKyB2YWx1ZSAvIHRoaXMuZGF0YS5zY2FsZSwgYm91bmRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBib3VuZHMgPSB0aGlzLmdldEJvdW5kT3JNYXhpbXVtKCdsZWZ0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLmJldHdlZW5Cb3VuZHModGhpcy5fZHJhZ1N0b3JlLmxlZnQgKyB2YWx1ZSAvIHRoaXMuZGF0YS5zY2FsZSwgYm91bmRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRPck1heGltdW0oJ3RvcCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5iZXR3ZWVuQm91bmRzKHRoaXMuX2RyYWdTdG9yZS50b3AgKyB2YWx1ZSAvIHRoaXMuZGF0YS5zY2FsZSwgYm91bmRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5nZXRGaXhlZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29vcmRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZW50cnkpIHtcbiAgICAgICAgICAgIHZhciBmaXhlZENvb3JkcyA9IF9fYXNzaWduKHt9LCBhY2MpO1xuICAgICAgICAgICAgc3dpdGNoIChlbnRyeVswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgZml4ZWRDb29yZHMucmlnaHQgPSBfdGhpcy5nZXRSaWdodChlbnRyeVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICBmaXhlZENvb3Jkcy5sZWZ0ID0gX3RoaXMuZ2V0TGVmdChlbnRyeVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZpeGVkQ29vcmRzLnRvcCA9IF90aGlzLmdldFRvcChlbnRyeVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZml4ZWRDb29yZHM7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50VHlwZSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIHtcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGV2ZW50VHlwZSA9PT0gRFJBR19FVkVOVC5EUkFHLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgcmlnaHQ6IChfYSA9IHRoaXMuX2Nvb3Jkcy5yaWdodCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5yaWdodCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAoX2IgPSB0aGlzLl9jb29yZHMubGVmdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgIHRvcDogKF9jID0gdGhpcy5fY29vcmRzLnRvcCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdGhpcy50b3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGRyYWdFdmVudCk7XG4gICAgICAgIHJldHVybiBkcmFnRXZlbnQ7XG4gICAgfTtcbiAgICBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2Nvb3Jkcy5yaWdodCA9PT0gVHlwZW9mLk5VTUJFUikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0ID0gdGhpcy5fY29vcmRzLnJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2Nvb3Jkcy5sZWZ0ID09PSBUeXBlb2YuTlVNQkVSKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IHRoaXMuX2Nvb3Jkcy5sZWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2Nvb3Jkcy50b3AgPT09IFR5cGVvZi5OVU1CRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLl9jb29yZHMudG9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLnN0YXJ0RHJhZyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB2YXIgX2EgPSBnZXRDbGllbnRDb29yZHMoZXZlbnQpLCBjbGllbnRYID0gX2EuY2xpZW50WCwgY2xpZW50WSA9IF9hLmNsaWVudFk7XG4gICAgICAgIHRoaXMuX2RyYWdTdG9yZS54ID0gY2xpZW50WDtcbiAgICAgICAgdGhpcy5fZHJhZ1N0b3JlLnkgPSBjbGllbnRZO1xuICAgICAgICB0aGlzLl9kcmFnU3RvcmUucmlnaHQgPSB0aGlzLnJpZ2h0O1xuICAgICAgICB0aGlzLl9kcmFnU3RvcmUubGVmdCA9IHRoaXMubGVmdDtcbiAgICAgICAgdGhpcy5fZHJhZ1N0b3JlLnRvcCA9IHRoaXMudG9wO1xuICAgICAgICB0aGlzLl91cGRhdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLm1vdmVFbGVtZW50KHsgY2xpZW50WDogY2xpZW50WCwgY2xpZW50WTogY2xpZW50WSB9KTtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRTLlRPVUNIX01PVkUsIHRoaXMubW92ZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVFMuVE9VQ0hfRU5ELCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfTU9WRSwgdGhpcy5tb3ZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRTLk1PVVNFX1VQLCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgX3JlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLm1vdmVFbGVtZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IGdldENsaWVudENvb3JkcyhldmVudCksIGNsaWVudFggPSBfYS5jbGllbnRYLCBjbGllbnRZID0gX2EuY2xpZW50WTtcbiAgICAgICAgdmFyIGRpZmZYID0gY2xpZW50WCAtIHRoaXMuX2RyYWdTdG9yZS54O1xuICAgICAgICB2YXIgZGlmZlkgPSBjbGllbnRZIC0gdGhpcy5fZHJhZ1N0b3JlLnk7XG4gICAgICAgIGlmICh0aGlzLl9kcmFnID09PSBQbGFuZVZpZXcuVE9QKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0aGlzLmdldEZpeGVkQ29vcmRpbmF0ZXMoZ2V0VG9wUGxhbmVQb2ludEZyb21Db29yZGluYXRlcyhkaWZmWCwgZGlmZlkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9kcmFnID09PSBQbGFuZVZpZXcuRlJPTlQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nvb3JkcyA9IHRoaXMuZ2V0Rml4ZWRDb29yZGluYXRlcyhnZXRGcm9udFBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMoZGlmZlgsIGRpZmZZKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0aGlzLmdldEZpeGVkQ29vcmRpbmF0ZXMoZ2V0U2lkZVBsYW5lUG9pbnRGcm9tQ29vcmRpbmF0ZXMoZGlmZlgsIGRpZmZZKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRyYWdFdmVudDtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KERSQUdfRVZFTlQuRFJBR19TVEFSVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICBkcmFnRXZlbnQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoRFJBR19FVkVOVC5EUkFHKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2ZW50ZWQgPSAhIShkcmFnRXZlbnQgJiYgZHJhZ0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmRyb3BFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl91cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRTLlRPVUNIX01PVkUsIHRoaXMubW92ZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuVE9VQ0hfRU5ELCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfTU9WRSwgdGhpcy5tb3ZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRTLk1PVVNFX1VQLCB0aGlzLmRyb3BFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KERSQUdfRVZFTlQuRFJBR19FTkQpO1xuICAgIH07XG4gICAgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLmJlZ2luRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRTLlRPVUNIX1NUQVJULCB0aGlzLnN0YXJ0RHJhZywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5UUy5NT1VTRV9ET1dOLCB0aGlzLnN0YXJ0RHJhZywgdHJ1ZSk7XG4gICAgfTtcbiAgICBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUuc3RvcERyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UUy5UT1VDSF9TVEFSVCwgdGhpcy5zdGFydERyYWcsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuVE9VQ0hfTU9WRSwgdGhpcy5tb3ZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UUy5UT1VDSF9FTkQsIHRoaXMuZHJvcEVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfRE9XTiwgdGhpcy5zdGFydERyYWcsIHRydWUpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UUy5NT1VTRV9NT1ZFLCB0aGlzLm1vdmVFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVFMuTU9VU0VfVVAsIHRoaXMuZHJvcEVsZW1lbnQsIHRydWUpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZSwgXCJyaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMucmlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5yaWdodCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUsIFwibGVmdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMubGVmdDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmxlZnQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5sZWZ0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdC5wcm90b3R5cGUsIFwidG9wXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy50b3A7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy50b3AgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy50b3AgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0LnByb3RvdHlwZSwgXCJkcmFnXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhZyB8fCBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fZHJhZyA9PT0gVHlwZW9mLlVOREVGSU5FRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RyYWcgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChfaXNCcm93c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5EcmFnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QucHJvdG90eXBlLCBcImJvdW5kc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kcyB8fCBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcyA9IHZhbHVlO1xuICAgICAgICAgICAgdmFyIGJvdW5kc1JpZ2h0ID0gdGhpcy5nZXRCb3VuZE9yTWF4aW11bSgncmlnaHQnKTtcbiAgICAgICAgICAgIHZhciBib3VuZHNMZWZ0ID0gdGhpcy5nZXRCb3VuZE9yTWF4aW11bSgnbGVmdCcpO1xuICAgICAgICAgICAgdmFyIGJvdW5kc1RvcCA9IHRoaXMuZ2V0Qm91bmRPck1heGltdW0oJ3RvcCcpO1xuICAgICAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMuYmV0d2VlbkJvdW5kcyh0aGlzLnJpZ2h0LCBib3VuZHNSaWdodCk7XG4gICAgICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmJldHdlZW5Cb3VuZHModGhpcy5sZWZ0LCBib3VuZHNMZWZ0KTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gdGhpcy5iZXR3ZWVuQm91bmRzKHRoaXMudG9wLCBib3VuZHNUb3ApO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0O1xufShJc29tZXRyaWNFbGVtZW50QWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0IH07XG4iLCJleHBvcnQgeyBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdCB9IGZyb20gJy4vSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgeyBTVkdfRUxFTUVOVFMgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IHV1aWQsIGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50IH0gZnJvbSAnQHV0aWxzL21hdGgnO1xuaW1wb3J0IHsgZWxlbWVudEhhc1NWR1BhcmVudCwgYWRkU1ZHUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMgfSBmcm9tICdAdXRpbHMvb3RoZXInO1xuaW1wb3J0IHsgSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNDb250YWluZXJBYnN0cmFjdCc7XG5pbXBvcnQgeyBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0JztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG59O1xudmFyIElzb21ldHJpY0dyb3VwID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljR3JvdXAocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzID09PSB2b2lkIDApIHsgcHJvcHMgPSB7fTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcy5pZCB8fCB1dWlkKCksIFNWR19FTEVNRU5UUy5ncm91cCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdFByb3BzKSwgcHJvcHMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY0dyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChlbGVtZW50SGFzU1ZHUGFyZW50KHRoaXMuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50RnJvbUlzb21ldHJpY1BvaW50KDAsIDAsIHtcbiAgICAgICAgICAgICAgICByOiB0aGlzLnByb3BzLnJpZ2h0LFxuICAgICAgICAgICAgICAgIGw6IHRoaXMucHJvcHMubGVmdCxcbiAgICAgICAgICAgICAgICB0OiB0aGlzLnByb3BzLnRvcFxuICAgICAgICAgICAgfSwgdGhpcy5kYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZShcIi5jb25jYXQocG9pbnQueCwgXCIsIFwiKS5jb25jYXQocG9pbnQueSwgXCIpXCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNHcm91cDtcbn0oSXNvbWV0cmljQ29udGFpbmVyQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY0dyb3VwIH07XG5hcHBseU1peGlucyhJc29tZXRyaWNHcm91cCwgSXNvbWV0cmljRHJhZ2dhYmxlQWJzdHJhY3QpO1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljR3JvdXAgfSBmcm9tICcuL0lzb21ldHJpY0dyb3VwJztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBnZXRTVkdQYXRoLCBnZXRUZXh0dXJlQ29ybmVyLCBlbGVtZW50SGFzU1ZHUGFyZW50IH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG5pbXBvcnQgeyBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgfSBmcm9tICcuLi9Jc29tZXRyaWNHcmFwaGljQWJzdHJhY3QnO1xudmFyIElzb21ldHJpY1BhdGhBYnN0cmFjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1BhdGhBYnN0cmFjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNQYXRoQWJzdHJhY3QocHJvcHMsIHN2Z0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLCBzdmdFbGVtZW50KSB8fCB0aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNQYXRoQWJzdHJhY3QucHJvdG90eXBlLnVwZGF0ZUdyYXBoaWMgPSBmdW5jdGlvbiAocGxhbmVWaWV3LCBhdXRvY2xvc2UpIHtcbiAgICAgICAgaWYgKGF1dG9jbG9zZSA9PT0gdm9pZCAwKSB7IGF1dG9jbG9zZSA9IHRydWU7IH1cbiAgICAgICAgaWYgKGVsZW1lbnRIYXNTVkdQYXJlbnQodGhpcy5lbGVtZW50KSkge1xuICAgICAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy5nZXRDb21tYW5kcygpO1xuICAgICAgICAgICAgdmFyIGNvcm5lciA9IGdldFRleHR1cmVDb3JuZXIoY29tbWFuZHMsIHRoaXMuZGF0YS5jZW50ZXJYLCB0aGlzLmRhdGEuY2VudGVyWSwgdGhpcy5kYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgZDogZ2V0U1ZHUGF0aChjb21tYW5kcywgdGhpcy5kYXRhLmNlbnRlclgsIHRoaXMuZGF0YS5jZW50ZXJZLCB0aGlzLmRhdGEuc2NhbGUsIGF1dG9jbG9zZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYXR0ZXJuVHJhbnNmb3JtKGNvcm5lciwgcGxhbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQW5pbWF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSXNvbWV0cmljUGF0aEFic3RyYWN0O1xufShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1BhdGhBYnN0cmFjdCB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljUGF0aEFic3RyYWN0IH0gZnJvbSAnLi9Jc29tZXRyaWNQYXRoQWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgeyBTVkdfRUxFTUVOVFMgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IGFkZFNWR1Byb3BlcnRpZXMgfSBmcm9tICdAdXRpbHMvc3ZnJztcbmltcG9ydCB7IGFwcGx5TWl4aW5zIH0gZnJvbSAnQHV0aWxzL290aGVyJztcbmltcG9ydCB7IElzb21ldHJpY1BhdGhBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1BhdGhBYnN0cmFjdCc7XG5pbXBvcnQgeyBJc29tZXRyaWNEcmFnZ2FibGVBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0JztcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG59O1xudmFyIElzb21ldHJpY1NoYXBlQWJzdHJhY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJc29tZXRyaWNTaGFwZUFic3RyYWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1NoYXBlQWJzdHJhY3QocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkZWZhdWx0UHJvcHMpLCBwcm9wcyksIFNWR19FTEVNRU5UUy5wYXRoKSB8fCB0aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNTaGFwZUFic3RyYWN0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlR3JhcGhpYyh0aGlzLnBsYW5lVmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljU2hhcGVBYnN0cmFjdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICBkOiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljU2hhcGVBYnN0cmFjdC5wcm90b3R5cGUsIFwicGxhbmVWaWV3XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5wbGFuZVZpZXc7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnBsYW5lVmlldyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBJc29tZXRyaWNTaGFwZUFic3RyYWN0O1xufShJc29tZXRyaWNQYXRoQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1NoYXBlQWJzdHJhY3QgfTtcbmFwcGx5TWl4aW5zKElzb21ldHJpY1NoYXBlQWJzdHJhY3QsIElzb21ldHJpY0RyYWdnYWJsZUFic3RyYWN0KTtcbiIsImV4cG9ydCB7IElzb21ldHJpY1NoYXBlQWJzdHJhY3QgfSBmcm9tICcuL0lzb21ldHJpY1NoYXBlQWJzdHJhY3QnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IENvbW1hbmQsIFBsYW5lVmlldywgU1ZHX0VMRU1FTlRTLCBTVkdfTkFNRVNQQUNFLCB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0U1ZHUGF0aCwgdHJhbnNsYXRlQ29tbWFuZFBvaW50cywgYWRkU1ZHUHJvcGVydGllcywgaXNTVkdQcm9wZXJ0eSwgZ2V0QW5pbWF0aW9uUHJvcGVydGllcyB9IGZyb20gJ0B1dGlscy9zdmcnO1xuaW1wb3J0IHsgSXNvbWV0cmljU2hhcGVBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1NoYXBlQWJzdHJhY3QnO1xudmFyIElzb21ldHJpY1JlY3RhbmdsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1JlY3RhbmdsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNSZWN0YW5nbGUocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGhlaWdodCA9IHByb3BzLmhlaWdodCwgd2lkdGggPSBwcm9wcy53aWR0aCwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJlc3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl93aWR0aCA9IHdpZHRoO1xuICAgICAgICBfdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY1JlY3RhbmdsZS5wcm90b3R5cGUuZ2V0Q29tbWFuZHMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICB2YXIgcmlnaHQgPSAoX2EgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MucmlnaHQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmlnaHQ7XG4gICAgICAgIHZhciBsZWZ0ID0gKF9iID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLmxlZnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMubGVmdDtcbiAgICAgICAgdmFyIHRvcCA9IChfYyA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy50b3ApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRoaXMudG9wO1xuICAgICAgICB2YXIgd2lkdGggPSAoX2QgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3Mud2lkdGgpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHRoaXMud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSAoX2UgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGNvbW1hbmRzID0gW3sgY29tbWFuZDogQ29tbWFuZC5tb3ZlLCBwb2ludDogeyByOiAwLCBsOiAwLCB0OiAwIH0gfV07XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFuZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgUGxhbmVWaWV3LkZST05UOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IDAsIGw6IHdpZHRoLCB0OiAwIH0gfSwgeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IDAsIGw6IHdpZHRoLCB0OiBoZWlnaHQgfSB9LCB7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogMCwgbDogMCwgdDogaGVpZ2h0IH0gfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5TSURFOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IHdpZHRoLCBsOiAwLCB0OiAwIH0gfSwgeyBjb21tYW5kOiBDb21tYW5kLmxpbmUsIHBvaW50OiB7IHI6IHdpZHRoLCBsOiAwLCB0OiBoZWlnaHQgfSB9LCB7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogMCwgbDogMCwgdDogaGVpZ2h0IH0gfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5UT1A6XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogd2lkdGgsIGw6IDAsIHQ6IDAgfSB9LCB7IGNvbW1hbmQ6IENvbW1hbmQubGluZSwgcG9pbnQ6IHsgcjogd2lkdGgsIGw6IGhlaWdodCwgdDogMCB9IH0sIHsgY29tbWFuZDogQ29tbWFuZC5saW5lLCBwb2ludDogeyByOiAwLCBsOiBoZWlnaHQsIHQ6IDAgfSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVDb21tYW5kUG9pbnRzKGNvbW1hbmRzLCByaWdodCwgbGVmdCwgdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH07XG4gICAgSXNvbWV0cmljUmVjdGFuZ2xlLnByb3RvdHlwZS5nZXRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy5nZXRDb21tYW5kcyhhcmdzKTtcbiAgICAgICAgcmV0dXJuIGdldFNWR1BhdGgoY29tbWFuZHMsIHRoaXMuZGF0YS5jZW50ZXJYLCB0aGlzLmRhdGEuY2VudGVyWSwgdGhpcy5kYXRhLnNjYWxlLCB0cnVlKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1JlY3RhbmdsZS5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghaXNOYXRpdmVTVkdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IF90aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBfdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IF90aGlzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IF90aGlzLmhlaWdodFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgYW5pbWF0aW9uLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IGdldEFuaW1hdGlvblByb3BlcnRpZXMoX3RoaXMuZ2V0UmVjdGFuZ2xlUGF0aC5iaW5kKF90aGlzKSwgYW5pbWF0aW9uLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUy5hbmltYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5pbWF0aW9uLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygnZCcsIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljUmVjdGFuZ2xlLnByb3RvdHlwZSwgXCJ3aWR0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljUmVjdGFuZ2xlLnByb3RvdHlwZSwgXCJoZWlnaHRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJc29tZXRyaWNSZWN0YW5nbGUucHJvdG90eXBlLmFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYWRkQW5pbWF0aW9uLmNhbGwodGhpcywgYW5pbWF0aW9uKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNSZWN0YW5nbGU7XG59KElzb21ldHJpY1NoYXBlQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1JlY3RhbmdsZSB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljUmVjdGFuZ2xlIH0gZnJvbSAnLi9Jc29tZXRyaWNSZWN0YW5nbGUnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IENvbW1hbmQsIFBsYW5lVmlldywgU1ZHX0VMRU1FTlRTLCBTVkdfTkFNRVNQQUNFIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRTVkdQYXRoLCB0cmFuc2xhdGVDb21tYW5kUG9pbnRzLCBhZGRTVkdQcm9wZXJ0aWVzLCBpc1NWR1Byb3BlcnR5LCBnZXRBbmltYXRpb25Qcm9wZXJ0aWVzIH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG5pbXBvcnQgeyBJc29tZXRyaWNTaGFwZUFic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU2hhcGVBYnN0cmFjdCc7XG52YXIgSXNvbWV0cmljQ2lyY2xlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljQ2lyY2xlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY0NpcmNsZShwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmFkaXVzID0gcHJvcHMucmFkaXVzLCByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJyYWRpdXNcIl0pO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJlc3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9yYWRpdXMgPSByYWRpdXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljQ2lyY2xlLnByb3RvdHlwZS5nZXRDb21tYW5kcyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgdmFyIHJpZ2h0ID0gKF9hID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLnJpZ2h0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnJpZ2h0O1xuICAgICAgICB2YXIgbGVmdCA9IChfYiA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy5sZWZ0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLmxlZnQ7XG4gICAgICAgIHZhciB0b3AgPSAoX2MgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MudG9wKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0aGlzLnRvcDtcbiAgICAgICAgdmFyIHJhZGl1cyA9IChfZCA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy5yYWRpdXMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHRoaXMucmFkaXVzO1xuICAgICAgICB2YXIgY29tbWFuZHMgPSBbXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYW5lVmlldykge1xuICAgICAgICAgICAgY2FzZSBQbGFuZVZpZXcuRlJPTlQ6XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQubW92ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IHsgcjogMCwgbDogcmFkaXVzLCB0OiAwIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6IDAsIGw6IC1yYWRpdXMsIHQ6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbDogeyByOiAwLCBsOiAwLCB0OiAtcmFkaXVzIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6IDAsIGw6IHJhZGl1cywgdDogMCB9LFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sOiB7IHI6IDAsIGw6IDAsIHQ6IHJhZGl1cyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5TSURFOlxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50OiB7IHI6IC1yYWRpdXMsIGw6IDAsIHQ6IDAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5jdXJ2ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IHsgcjogcmFkaXVzLCBsOiAwLCB0OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHsgcjogMCwgbDogMCwgdDogLXJhZGl1cyB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLmN1cnZlLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiAtcmFkaXVzLCBsOiAwLCB0OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHsgcjogMCwgbDogMCwgdDogcmFkaXVzIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGxhbmVWaWV3LlRPUDpcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5tb3ZlLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiAwLCBsOiByYWRpdXMsIHQ6IDAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZC5jdXJ2ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IHsgcjogMCwgbDogLXJhZGl1cywgdDogMCB9LFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sOiB7IHI6IHJhZGl1cywgbDogMCwgdDogMCB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLmN1cnZlLFxuICAgICAgICAgICAgICAgICAgICBwb2ludDogeyByOiAwLCBsOiByYWRpdXMsIHQ6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbDogeyByOiAtcmFkaXVzLCBsOiAwLCB0OiAwIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVDb21tYW5kUG9pbnRzKGNvbW1hbmRzLCByaWdodCwgbGVmdCwgdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH07XG4gICAgSXNvbWV0cmljQ2lyY2xlLnByb3RvdHlwZS5nZXRDaXJjbGVQYXRoID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy5nZXRDb21tYW5kcyhhcmdzKTtcbiAgICAgICAgcmV0dXJuIGdldFNWR1BhdGgoY29tbWFuZHMsIHRoaXMuZGF0YS5jZW50ZXJYLCB0aGlzLmRhdGEuY2VudGVyWSwgdGhpcy5kYXRhLnNjYWxlLCB0cnVlKTtcbiAgICB9O1xuICAgIElzb21ldHJpY0NpcmNsZS5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghaXNOYXRpdmVTVkdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IF90aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBfdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBfdGhpcy5yYWRpdXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvcHMsIGFuaW1hdGlvbi5wcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBnZXRBbmltYXRpb25Qcm9wZXJ0aWVzKF90aGlzLmdldENpcmNsZVBhdGguYmluZChfdGhpcyksIGFuaW1hdGlvbiwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCBTVkdfRUxFTUVOVFMuYW5pbWF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb24uZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGRBbmltYXRpb25CYXNpY1Byb3BlcnRpZXMoJ2QnLCBhbmltYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKGFuaW1hdGlvbi5lbGVtZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY0NpcmNsZS5wcm90b3R5cGUsIFwicmFkaXVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFkaXVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFkaXVzID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgSXNvbWV0cmljQ2lyY2xlLnByb3RvdHlwZS5hZGRBbmltYXRpb24gPSBmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmFkZEFuaW1hdGlvbi5jYWxsKHRoaXMsIGFuaW1hdGlvbik7XG4gICAgfTtcbiAgICByZXR1cm4gSXNvbWV0cmljQ2lyY2xlO1xufShJc29tZXRyaWNTaGFwZUFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNDaXJjbGUgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY0NpcmNsZSB9IGZyb20gJy4vSXNvbWV0cmljQ2lyY2xlJztcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBDb21tYW5kLCBQbGFuZVZpZXcsIFNWR19FTEVNRU5UUywgU1ZHX05BTUVTUEFDRSwgfSBmcm9tICdAY29uc3RhbnRzJztcbmltcG9ydCB7IGdldFNWR1BhdGgsIHRyYW5zbGF0ZUNvbW1hbmRQb2ludHMsIGFkZFNWR1Byb3BlcnRpZXMsIGlzU1ZHUHJvcGVydHksIGdldEFuaW1hdGlvblByb3BlcnRpZXMgfSBmcm9tICdAdXRpbHMvc3ZnJztcbmltcG9ydCB7IElzb21ldHJpY1NoYXBlQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTaGFwZUFic3RyYWN0JztcbnZhciBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0KHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByYWRpdXMgPSBwcm9wcy5yYWRpdXMsIHBvaW50cyA9IHByb3BzLnBvaW50cywgZGVuc2l0eSA9IHByb3BzLmRlbnNpdHksIF9hID0gcHJvcHMucm90YXRpb24sIHJvdGF0aW9uID0gX2EgPT09IHZvaWQgMCA/IDAgOiBfYSwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wicmFkaXVzXCIsIFwicG9pbnRzXCIsIFwiZGVuc2l0eVwiLCBcInJvdGF0aW9uXCJdKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCByZXN0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fcmFkaXVzID0gcmFkaXVzO1xuICAgICAgICBfdGhpcy5fcG9pbnRzID0gcG9pbnRzO1xuICAgICAgICBfdGhpcy5fZGVuc2l0eSA9IGRlbnNpdHk7XG4gICAgICAgIF90aGlzLl9yb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgICAgICBfdGhpcy5fc2VjdG9yID0gMiAqIE1hdGguUEkgLyBfdGhpcy5fcG9pbnRzO1xuICAgICAgICBfdGhpcy5faGFsZlNlY3RvciA9IF90aGlzLl9zZWN0b3IgLyAyO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmdldENvbW1hbmRzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICB2YXIgcmlnaHQgPSAoX2EgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MucmlnaHQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmlnaHQ7XG4gICAgICAgIHZhciBsZWZ0ID0gKF9iID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLmxlZnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMubGVmdDtcbiAgICAgICAgdmFyIHRvcCA9IChfYyA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy50b3ApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRoaXMudG9wO1xuICAgICAgICB2YXIgcmFkaXVzID0gKF9kID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLnJhZGl1cykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdGhpcy5yYWRpdXM7XG4gICAgICAgIHZhciBwb2ludHMgPSAoX2UgPSBhcmdzID09PSBudWxsIHx8IGFyZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFyZ3MucG9pbnRzKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLl9wb2ludHM7XG4gICAgICAgIHZhciBkZW5zaXR5ID0gKF9mID0gYXJncyA9PT0gbnVsbCB8fCBhcmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmdzLmRlbnNpdHkpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHRoaXMuX2RlbnNpdHk7XG4gICAgICAgIHZhciByb3RhdGlvbiA9IChfZyA9IGFyZ3MgPT09IG51bGwgfHwgYXJncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJncy5yb3RhdGlvbikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5yb3RhdGlvbjtcbiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gdGhpcy5nZXQyRENvb3JkaW5hdGVzKHJhZGl1cywgcG9pbnRzLCBkZW5zaXR5LCByb3RhdGlvbik7XG4gICAgICAgIHZhciBjb21tYW5kcyA9IFtdO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhbmVWaWV3KSB7XG4gICAgICAgICAgICBjYXNlIFBsYW5lVmlldy5GUk9OVDpcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBpbmRleCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29tbWFuZC5tb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb21tYW5kLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogcG9pbnQueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0OiBwb2ludC55XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGFuZVZpZXcuU0lERTpcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBpbmRleCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29tbWFuZC5tb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb21tYW5kLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IHBvaW50LngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0OiBwb2ludC55XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGFuZVZpZXcuVE9QOlxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGluZGV4ID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDb21tYW5kLm1vdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbW1hbmQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcjogLXBvaW50LngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogLXBvaW50LnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVDb21tYW5kUG9pbnRzKGNvbW1hbmRzLCByaWdodCwgbGVmdCwgdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH07XG4gICAgSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC5wcm90b3R5cGUuX2dldFJhZGlhbkFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgICAgIHJldHVybiBhbmdsZSAqIE1hdGguUEkgLyAxODA7XG4gICAgfTtcbiAgICBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0LnByb3RvdHlwZS5fZ2V0SW5uZXJSYWRpdXMgPSBmdW5jdGlvbiAocmFkaXVzLCBwb2ludHMsIGRlbnNpdHkpIHtcbiAgICAgICAgcmV0dXJuIHJhZGl1cyAqIE1hdGguY29zKE1hdGguUEkgKiBkZW5zaXR5IC8gcG9pbnRzKSAvIE1hdGguY29zKE1hdGguUEkgKiAoZGVuc2l0eSAtIDEpIC8gcG9pbnRzKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmdldDJEQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAocmFkaXVzLCBwb2ludHMsIGRlbnNpdHksIHJvdGF0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBpbm5lclJhZGl1cyA9IHRoaXMuX2dldElubmVyUmFkaXVzKHJhZGl1cywgcG9pbnRzLCBkZW5zaXR5KTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoW10sIEFycmF5KHRoaXMuX3BvaW50cyksIHRydWUpLnJlZHVjZShmdW5jdGlvbiAocG9pbnRzLCBfdW5kZWZpbmVkLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIGFuZ2xlID0gaW5kZXggKiBfdGhpcy5fc2VjdG9yICsgMiAqIE1hdGguUEkgLSBfdGhpcy5fZ2V0UmFkaWFuQW5nbGUocm90YXRpb24pO1xuICAgICAgICAgICAgdmFyIGlubmVyQW5nbGUgPSBhbmdsZSArIF90aGlzLl9oYWxmU2VjdG9yO1xuICAgICAgICAgICAgdmFyIG9YID0gTWF0aC5zaW4oYW5nbGUpICogcmFkaXVzO1xuICAgICAgICAgICAgdmFyIG9ZID0gTWF0aC5jb3MoYW5nbGUpICogcmFkaXVzO1xuICAgICAgICAgICAgdmFyIGlYID0gTWF0aC5zaW4oaW5uZXJBbmdsZSkgKiBpbm5lclJhZGl1cztcbiAgICAgICAgICAgIHZhciBpWSA9IE1hdGguY29zKGlubmVyQW5nbGUpICogaW5uZXJSYWRpdXM7XG4gICAgICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBwb2ludHMsIHRydWUpLCBbXG4gICAgICAgICAgICAgICAgeyB4OiBvWCwgeTogb1kgfSxcbiAgICAgICAgICAgICAgICB7IHg6IGlYLCB5OiBpWSB9XG4gICAgICAgICAgICBdLCBmYWxzZSk7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmdldFBlbnRhZ3JhbVBhdGggPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgY29tbWFuZHMgPSB0aGlzLmdldENvbW1hbmRzKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZ2V0U1ZHUGF0aChjb21tYW5kcywgdGhpcy5kYXRhLmNlbnRlclgsIHRoaXMuZGF0YS5jZW50ZXJZLCB0aGlzLmRhdGEuc2NhbGUsIHRydWUpO1xuICAgIH07XG4gICAgSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgaXNOYXRpdmVTVkdQcm9wZXJ0eSA9IGlzU1ZHUHJvcGVydHkoYW5pbWF0aW9uLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghaXNOYXRpdmVTVkdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IF90aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBfdGhpcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IF90aGlzLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBfdGhpcy5yYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50czogX3RoaXMuX3BvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVuc2l0eTogX3RoaXMuX2RlbnNpdHksXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBfdGhpcy5yb3RhdGlvblxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgYW5pbWF0aW9uLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IGdldEFuaW1hdGlvblByb3BlcnRpZXMoX3RoaXMuZ2V0UGVudGFncmFtUGF0aC5iaW5kKF90aGlzKSwgYW5pbWF0aW9uLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUy5hbmltYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5pbWF0aW9uLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygnZCcsIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXMoYW5pbWF0aW9uLmVsZW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdC5wcm90b3R5cGUsIFwicmFkaXVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFkaXVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFkaXVzID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLCBcInJvdGF0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb247XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QucHJvdG90eXBlLmFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYWRkQW5pbWF0aW9uLmNhbGwodGhpcywgYW5pbWF0aW9uKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0O1xufShJc29tZXRyaWNTaGFwZUFic3RyYWN0KSk7XG5leHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0IH07XG4iLCJleHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0IH0gZnJvbSAnLi9Jc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0IH0gZnJvbSAnQGNsYXNzZXMvYWJzdHJhY3QvSXNvbWV0cmljU3RhclBvbHlnb25BYnN0cmFjdCc7XG52YXIgSXNvbWV0cmljUGVudGFncmFtID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSXNvbWV0cmljUGVudGFncmFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1BlbnRhZ3JhbShwcm9wcykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzKSwgeyBwb2ludHM6IDUsIGRlbnNpdHk6IDIgfSkpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBJc29tZXRyaWNQZW50YWdyYW07XG59KElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1BlbnRhZ3JhbSB9O1xuIiwiZXhwb3J0IHsgSXNvbWV0cmljUGVudGFncmFtIH0gZnJvbSAnLi9Jc29tZXRyaWNQZW50YWdyYW0nO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbmltcG9ydCB7IElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNTdGFyUG9seWdvbkFic3RyYWN0JztcbnZhciBJc29tZXRyaWNTdGFyUG9seWdvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1N0YXJQb2x5Z29uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzb21ldHJpY1N0YXJQb2x5Z29uKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1N0YXJQb2x5Z29uLnByb3RvdHlwZSwgXCJwb2ludHNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb2ludHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlY3RvciA9IDIgKiBNYXRoLlBJIC8gdGhpcy5fcG9pbnRzO1xuICAgICAgICAgICAgdGhpcy5faGFsZlNlY3RvciA9IHRoaXMuX3NlY3RvciAvIDI7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1N0YXJQb2x5Z29uLnByb3RvdHlwZSwgXCJkZW5zaXR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVuc2l0eTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbnNpdHkgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gSXNvbWV0cmljU3RhclBvbHlnb247XG59KElzb21ldHJpY1N0YXJQb2x5Z29uQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1N0YXJQb2x5Z29uIH07XG4iLCJleHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbiB9IGZyb20gJy4vSXNvbWV0cmljU3RhclBvbHlnb24nO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbmltcG9ydCB7IENvbW1hbmQsIFNWR19FTEVNRU5UUywgU1ZHX05BTUVTUEFDRSB9IGZyb20gJ0Bjb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkU1ZHUHJvcGVydGllcywgcGFyc2VEcmF3Q29tbWFuZHMsIGdldFNWR1BhdGgsIGdldEFuaW1hdGlvblByb3BlcnRpZXMgfSBmcm9tICdAdXRpbHMvc3ZnJztcbmltcG9ydCB7IElzb21ldHJpY1BhdGhBYnN0cmFjdCB9IGZyb20gJ0BjbGFzc2VzL2Fic3RyYWN0L0lzb21ldHJpY1BhdGhBYnN0cmFjdCc7XG52YXIgSXNvbWV0cmljUGF0aCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1BhdGgsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljUGF0aChwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMgPT09IHZvaWQgMCkgeyBwcm9wcyA9IHt9OyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLCBTVkdfRUxFTUVOVFMucGF0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZ2V0UGF0aEZyb21Db21tYW5kcyA9IGZ1bmN0aW9uIChjb21tYW5kcykgeyByZXR1cm4gZ2V0U1ZHUGF0aChwYXJzZURyYXdDb21tYW5kcyhcIlwiLmNvbmNhdChjb21tYW5kcykpLCBfdGhpcy5kYXRhLmNlbnRlclgsIF90aGlzLmRhdGEuY2VudGVyWSwgX3RoaXMuZGF0YS5zY2FsZSwgX3RoaXMuX2F1dG9jbG9zZSk7IH07XG4gICAgICAgIF90aGlzLmNvbW1hbmRzID0gW107XG4gICAgICAgIF90aGlzLl9hdXRvY2xvc2UgPSAnYXV0b2Nsb3NlJyBpbiBwcm9wc1xuICAgICAgICAgICAgPyBwcm9wcy5hdXRvY2xvc2VcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJc29tZXRyaWNQYXRoLnByb3RvdHlwZS51cGRhdGVTdWJDbGFzc0FuaW1hdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb24ucHJvcGVydHkgPT09ICdwYXRoJykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gZ2V0QW5pbWF0aW9uUHJvcGVydGllcyhfdGhpcy5nZXRQYXRoRnJvbUNvbW1hbmRzLmJpbmQoX3RoaXMpLCBhbmltYXRpb24pO1xuICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLmFuaW1hdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWFuaW1hdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChhbmltYXRpb24uZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygnZCcsIGFuaW1hdGlvbik7XG4gICAgICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhhbmltYXRpb24uZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUuZ2V0Q29tbWFuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRzO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1BhdGgucHJvdG90eXBlLCBcImF1dG9jbG9zZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jbG9zZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9jbG9zZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVHcmFwaGljKHVuZGVmaW5lZCwgdGhpcy5hdXRvY2xvc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKTtcbiAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLmVsZW1lbnQsIHtcbiAgICAgICAgICAgIGQ6ICcnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uIChyaWdodCwgbGVmdCwgdG9wKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kLm1vdmUsXG4gICAgICAgICAgICBwb2ludDogeyByOiByaWdodCwgbDogbGVmdCwgdDogdG9wIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUubGluZVRvID0gZnVuY3Rpb24gKHJpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgICAgICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQubGluZSxcbiAgICAgICAgICAgIHBvaW50OiB7IHI6IHJpZ2h0LCBsOiBsZWZ0LCB0OiB0b3AgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNQYXRoLnByb3RvdHlwZS5jdXJ2ZVRvID0gZnVuY3Rpb24gKGNvbnRyb2xSaWdodCwgY29udHJvbExlZnQsIGNvbnRyb2xUb3AsIHJpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgICAgICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmQuY3VydmUsXG4gICAgICAgICAgICBjb250cm9sOiB7IHI6IGNvbnRyb2xSaWdodCwgbDogY29udHJvbExlZnQsIHQ6IGNvbnRyb2xUb3AgfSxcbiAgICAgICAgICAgIHBvaW50OiB7IHI6IHJpZ2h0LCBsOiBsZWZ0LCB0OiB0b3AgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBJc29tZXRyaWNQYXRoLnByb3RvdHlwZS5tdCA9IGZ1bmN0aW9uIChyaWdodCwgbGVmdCwgdG9wKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmVUbyhyaWdodCwgbGVmdCwgdG9wKTtcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24gKHJpZ2h0LCBsZWZ0LCB0b3ApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZVRvKHJpZ2h0LCBsZWZ0LCB0b3ApO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUuY3QgPSBmdW5jdGlvbiAoY29udHJvbFJpZ2h0LCBjb250cm9sTGVmdCwgY29udHJvbFRvcCwgcmlnaHQsIGxlZnQsIHRvcCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZVRvKGNvbnRyb2xSaWdodCwgY29udHJvbExlZnQsIGNvbnRyb2xUb3AsIHJpZ2h0LCBsZWZ0LCB0b3ApO1xuICAgIH07XG4gICAgSXNvbWV0cmljUGF0aC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChjb21tYW5kcykge1xuICAgICAgICB0aGlzLmNvbW1hbmRzID0gcGFyc2VEcmF3Q29tbWFuZHMoY29tbWFuZHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIElzb21ldHJpY1BhdGgucHJvdG90eXBlLmFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYWRkQW5pbWF0aW9uLmNhbGwodGhpcywgYW5pbWF0aW9uKTtcbiAgICB9O1xuICAgIHJldHVybiBJc29tZXRyaWNQYXRoO1xufShJc29tZXRyaWNQYXRoQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1BhdGggfTtcbiIsImV4cG9ydCAqIGZyb20gJy4vSXNvbWV0cmljUGF0aCc7XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IFNWR19OQU1FU1BBQ0UsIFNWR19FTEVNRU5UUywgT1JJR0lOIH0gZnJvbSAnQGNvbnN0YW50cyc7XG5pbXBvcnQgeyBJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QgfSBmcm9tICdAY2xhc3Nlcy9hYnN0cmFjdC9Jc29tZXRyaWNHcmFwaGljQWJzdHJhY3QnO1xuaW1wb3J0IHsgZ2V0UG9pbnRGcm9tSXNvbWV0cmljUG9pbnQgfSBmcm9tICdAdXRpbHMvbWF0aCc7XG5pbXBvcnQgeyBhZGRTVkdQcm9wZXJ0aWVzLCBlbGVtZW50SGFzU1ZHUGFyZW50LCBnZXRQYXR0ZXJuVHJhbnNmb3JtLCBpc1NWR1Byb3BlcnR5IH0gZnJvbSAnQHV0aWxzL3N2Zyc7XG52YXIgSXNvbWV0cmljVGV4dCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzb21ldHJpY1RleHQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSXNvbWV0cmljVGV4dChwcm9wcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBwbGFuZVZpZXcgPSBwcm9wcy5wbGFuZVZpZXcsIF9iID0gcHJvcHMudGV4dCwgdGV4dCA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBfYyA9IHByb3BzLmZvbnRGYW1pbHksIGZvbnRGYW1pbHkgPSBfYyA9PT0gdm9pZCAwID8gJ0FyaWFsJyA6IF9jLCBfZCA9IHByb3BzLmZvbnRTaXplLCBmb250U2l6ZSA9IF9kID09PSB2b2lkIDAgPyAxMiA6IF9kLCBfZSA9IHByb3BzLmZvbnRTdHlsZSwgZm9udFN0eWxlID0gX2UgPT09IHZvaWQgMCA/ICdub3JtYWwnIDogX2UsIF9mID0gcHJvcHMuZm9udFdlaWdodCwgZm9udFdlaWdodCA9IF9mID09PSB2b2lkIDAgPyAnbm9ybWFsJyA6IF9mLCBfZyA9IHByb3BzLm9yaWdpbiwgb3JpZ2luID0gX2cgPT09IHZvaWQgMCA/IFsnY2VudGVyJywgJ2NlbnRlciddIDogX2csIF9oID0gcHJvcHMucmlnaHQsIHJpZ2h0ID0gX2ggPT09IHZvaWQgMCA/IDAgOiBfaCwgX2ogPSBwcm9wcy5sZWZ0LCBsZWZ0ID0gX2ogPT09IHZvaWQgMCA/IDAgOiBfaiwgX2sgPSBwcm9wcy50b3AsIHRvcCA9IF9rID09PSB2b2lkIDAgPyAwIDogX2ssIF9sID0gcHJvcHMucm90YXRpb24sIHJvdGF0aW9uID0gX2wgPT09IHZvaWQgMCA/IDAgOiBfbCwgX20gPSBwcm9wcy5zZWxlY3RhYmxlLCBzZWxlY3RhYmxlID0gX20gPT09IHZvaWQgMCA/IHRydWUgOiBfbSwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wicGxhbmVWaWV3XCIsIFwidGV4dFwiLCBcImZvbnRGYW1pbHlcIiwgXCJmb250U2l6ZVwiLCBcImZvbnRTdHlsZVwiLCBcImZvbnRXZWlnaHRcIiwgXCJvcmlnaW5cIiwgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJ0b3BcIiwgXCJyb3RhdGlvblwiLCBcInNlbGVjdGFibGVcIl0pO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJlc3QsIFNWR19FTEVNRU5UUy5ncm91cCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX29yaWdpbkhhc2ggPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIF9hW09SSUdJTi5DRU5URVJdID0gJ21pZGRsZScsXG4gICAgICAgICAgICBfYVtPUklHSU4uTEVGVF0gPSAnc3RhcnQnLFxuICAgICAgICAgICAgX2FbT1JJR0lOLlJJR0hUXSA9ICdlbmQnLFxuICAgICAgICAgICAgX2FbT1JJR0lOLlRPUF0gPSAnaGFuZ2luZycsXG4gICAgICAgICAgICBfYVtPUklHSU4uQk9UVE9NXSA9ICdiYXNlbGluZScsXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIF90aGlzLmNvbW1vbkFuaW1hdGlvbkF0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGU6ICdYTUwnLFxuICAgICAgICAgICAgYWRkaXRpdmU6ICdzdW0nLFxuICAgICAgICAgICAgZmlsbDogJ2ZyZWV6ZSdcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuZ2V0TWF0cml4VHJhbnNmb3JtID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtTWF0cml4ID0gZ2V0UGF0dGVyblRyYW5zZm9ybShfdGhpcy5nZXRQb3NpdGlvblRyYW5zZm9ybShwcm9wcyksIF90aGlzLnBsYW5lVmlldywgMSk7XG4gICAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQodHJhbnNmb3JtTWF0cml4LCBcIiByb3RhdGUoXCIpLmNvbmNhdChfdGhpcy5yb3RhdGlvbiwgXCIpXCIpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5fdGV4dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLnRleHQpO1xuICAgICAgICBfdGhpcy5fdHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLnRzcGFuKTtcbiAgICAgICAgX3RoaXMuX3RleHRFbGVtZW50LmFwcGVuZENoaWxkKF90aGlzLl90c3Bhbik7XG4gICAgICAgIF90aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoX3RoaXMuX3RleHRFbGVtZW50KTtcbiAgICAgICAgX3RoaXMucGxhbmVWaWV3ID0gcGxhbmVWaWV3O1xuICAgICAgICBfdGhpcy5mb250RmFtaWx5ID0gZm9udEZhbWlseTtcbiAgICAgICAgX3RoaXMuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgX3RoaXMuZm9udFN0eWxlID0gZm9udFN0eWxlO1xuICAgICAgICBfdGhpcy5mb250V2VpZ2h0ID0gZm9udFdlaWdodDtcbiAgICAgICAgX3RoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gICAgICAgIF90aGlzLm9yaWdpbiA9IG9yaWdpbjtcbiAgICAgICAgX3RoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgX3RoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIF90aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgX3RoaXMucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICAgICAgX3RoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUuZ2V0UG9zaXRpb25UcmFuc2Zvcm0gPSBmdW5jdGlvbiAocHJvcHMsIGZyb21DZW50ZXIpIHtcbiAgICAgICAgaWYgKGZyb21DZW50ZXIgPT09IHZvaWQgMCkgeyBmcm9tQ2VudGVyID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gZ2V0UG9pbnRGcm9tSXNvbWV0cmljUG9pbnQoZnJvbUNlbnRlclxuICAgICAgICAgICAgPyB0aGlzLmRhdGEuY2VudGVyWFxuICAgICAgICAgICAgOiAwLCBmcm9tQ2VudGVyXG4gICAgICAgICAgICA/IHRoaXMuZGF0YS5jZW50ZXJZXG4gICAgICAgICAgICA6IDAsIHtcbiAgICAgICAgICAgIHI6IHByb3BzLnJpZ2h0LFxuICAgICAgICAgICAgbDogcHJvcHMubGVmdCxcbiAgICAgICAgICAgIHQ6IHByb3BzLnRvcFxuICAgICAgICB9LCB0aGlzLmRhdGEuc2NhbGUpO1xuICAgIH07XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUudXBkYXRlU3ViQ2xhc3NBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICByb3RhdGlvbjogMCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgdmFyIGlzTmF0aXZlU1ZHUHJvcGVydHkgPSBpc1NWR1Byb3BlcnR5KGFuaW1hdGlvbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIWlzTmF0aXZlU1ZHUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBhbmltYXRpb24ucHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eV8xID0gYW5pbWF0aW9uLnByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNSb3RhdGlvbl8xID0gcHJvcGVydHlfMSA9PT0gJ3JvdGF0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1vblByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIF90aGlzLmNvbW1vbkFuaW1hdGlvbkF0dHJpYnV0ZXMpLCB7IHR5cGU6IGlzUm90YXRpb25fMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JvdGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0cmFuc2xhdGUnLCBiZWdpbjogJ2luZGVmaW5pdGUnIH0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFuaW1hdGlvbi52YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IF9fYXNzaWduKHsgdmFsdWVzOiBhbmltYXRpb24udmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JvdGF0aW9uXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGlmaWVkQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRBcmdzW3Byb3BlcnR5XzFdID0gK3ZhbHVlIC0gX3RoaXNbcHJvcGVydHlfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvb3JkcyA9IF90aGlzLmdldFBvc2l0aW9uVHJhbnNmb3JtKG1vZGlmaWVkQXJncywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChjb29yZHMueCwgXCIsXCIpLmNvbmNhdChjb29yZHMueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJzsnKSB9LCBjb21tb25Qcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSb3RhdGlvbl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBfX2Fzc2lnbih7IHZhbHVlczogXCJcIi5jb25jYXQoYW5pbWF0aW9uLnZhbHVlcykgfSwgY29tbW9uUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGlmaWVkQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQXJnc1twcm9wZXJ0eV8xXSA9ICthbmltYXRpb24udmFsdWVzIC0gX3RoaXNbcHJvcGVydHlfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29yZHMgPSBfdGhpcy5nZXRQb3NpdGlvblRyYW5zZm9ybShtb2RpZmllZEFyZ3MsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IF9fYXNzaWduKHsgdmFsdWVzOiBcIlwiLmNvbmNhdChjb29yZHMueCwgXCIsXCIpLmNvbmNhdChjb29yZHMueSkgfSwgY29tbW9uUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JvdGF0aW9uXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gX19hc3NpZ24oeyBmcm9tOiBcIlwiLmNvbmNhdChhbmltYXRpb24uZnJvbSksIHRvOiBcIlwiLmNvbmNhdChhbmltYXRpb24udG8pIH0sIGNvbW1vblByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcm9tQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQXJncyA9IF9fYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUFyZ3NbcHJvcGVydHlfMV0gPSArYW5pbWF0aW9uLmZyb20gLSBfdGhpc1twcm9wZXJ0eV8xXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0FyZ3NbcHJvcGVydHlfMV0gPSArYW5pbWF0aW9uLnRvIC0gX3RoaXNbcHJvcGVydHlfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvb3Jkc0Zyb20gPSBfdGhpcy5nZXRQb3NpdGlvblRyYW5zZm9ybShmcm9tQXJncywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29yZHNUbyA9IF90aGlzLmdldFBvc2l0aW9uVHJhbnNmb3JtKHRvQXJncywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBfX2Fzc2lnbih7IGZyb206IFwiXCIuY29uY2F0KGNvb3Jkc0Zyb20ueCwgXCIsXCIpLmNvbmNhdChjb29yZHNGcm9tLnkpLCB0bzogXCJcIi5jb25jYXQoY29vcmRzVG8ueCwgXCIsXCIpLmNvbmNhdChjb29yZHNUby55KSB9LCBjb21tb25Qcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmltYXRpb24uZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgU1ZHX0VMRU1FTlRTLmFuaW1hdGVUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFuaW1hdGlvbkJhc2ljUHJvcGVydGllcygndHJhbnNmb3JtJywgYW5pbWF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyhhbmltYXRpb24uZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5pbWF0aW9uLmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUm90YXRpb25fMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl90ZXh0RWxlbWVudC5hcHBlbmRDaGlsZChhbmltYXRpb24uZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGFuaW1hdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbGVtZW50LmJlZ2luRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZWxlbWVudEhhc1NWR1BhcmVudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5nZXRNYXRyaXhUcmFuc2Zvcm0oe1xuICAgICAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnJpZ2h0LFxuICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMubGVmdCxcbiAgICAgICAgICAgICAgICB0b3A6IHRoaXMudG9wXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5fdGV4dEVsZW1lbnQsIHsgdHJhbnNmb3JtOiB0cmFuc2Zvcm0gfSk7XG4gICAgICAgICAgICB0aGlzLl90c3Bhbi50ZXh0Q29udGVudCA9IHRoaXMuX3RleHQ7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBhdHRlcm5UcmFuc2Zvcm0oeyB4OiAwLCB5OiAwIH0sIHRoaXMucGxhbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQW5pbWF0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgSXNvbWV0cmljVGV4dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJ0ZXh0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljVGV4dC5wcm90b3R5cGUsIFwicGxhbmVWaWV3XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGxhbmVWaWV3O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcGxhbmVWaWV3ID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1RleHQucHJvdG90eXBlLCBcImZvbnRGYW1pbHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb250RmFtaWx5O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9udEZhbWlseSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLl90c3Bhbiwge1xuICAgICAgICAgICAgICAgICdmb250LWZhbWlseSc6IHRoaXMuX2ZvbnRGYW1pbHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1RleHQucHJvdG90eXBlLCBcImZvbnRTaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9mb250U2l6ZSA9IHZhbHVlO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLl90c3Bhbiwge1xuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBcIlwiLmNvbmNhdCh0aGlzLl9mb250U2l6ZSwgXCJweFwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljVGV4dC5wcm90b3R5cGUsIFwiZm9udFN0eWxlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFN0eWxlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gdmFsdWU7XG4gICAgICAgICAgICBhZGRTVkdQcm9wZXJ0aWVzKHRoaXMuX3RzcGFuLCB7XG4gICAgICAgICAgICAgICAgJ2ZvbnQtc3R5bGUnOiBcIlwiLmNvbmNhdCh0aGlzLl9mb250U3R5bGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJmb250V2VpZ2h0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFdlaWdodDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvbnRXZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5fdHNwYW4sIHtcbiAgICAgICAgICAgICAgICAnZm9udC13ZWlnaHQnOiBcIlwiLmNvbmNhdCh0aGlzLl9mb250V2VpZ2h0KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXNvbWV0cmljVGV4dC5wcm90b3R5cGUsIFwic2VsZWN0YWJsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RhYmxlID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZFNWR1Byb3BlcnRpZXModGhpcy5fdGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICctd2Via2l0LXVzZXItc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICctbW96LXVzZXItc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICctbXMtdXNlci1zZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXItc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwb2ludGVyLWV2ZW50cydcbiAgICAgICAgICAgICAgICAgICAgXS5tYXAoZnVuY3Rpb24gKGRlY2wpIHsgcmV0dXJuIFwiXCIuY29uY2F0KGRlY2wsIFwiOiBub25lXCIpOyB9KS5qb2luKCc7JylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJvcmlnaW5cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW47XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9vcmlnaW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuX29yaWdpbiwgdGV4dEFuY2hvciA9IF9hWzBdLCBhbGlnbm1lbnRCYXNlbGluZSA9IF9hWzFdO1xuICAgICAgICAgICAgYWRkU1ZHUHJvcGVydGllcyh0aGlzLl90c3Bhbiwge1xuICAgICAgICAgICAgICAgICd0ZXh0LWFuY2hvcic6IHRoaXMuX29yaWdpbkhhc2hbdGV4dEFuY2hvcl0sXG4gICAgICAgICAgICAgICAgJ2FsaWdubWVudC1iYXNlbGluZSc6IHRoaXMuX29yaWdpbkhhc2hbYWxpZ25tZW50QmFzZWxpbmVdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJyaWdodFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JpZ2h0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJsZWZ0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGVmdDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElzb21ldHJpY1RleHQucHJvdG90eXBlLCBcInRvcFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvcDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b3AgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG9wID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJc29tZXRyaWNUZXh0LnByb3RvdHlwZSwgXCJyb3RhdGlvblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW9uICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBJc29tZXRyaWNUZXh0O1xufShJc29tZXRyaWNHcmFwaGljQWJzdHJhY3QpKTtcbmV4cG9ydCB7IElzb21ldHJpY1RleHQgfTtcbiIsImV4cG9ydCB7IElzb21ldHJpY1RleHQgfSBmcm9tICcuL0lzb21ldHJpY1RleHQnO1xuIiwiZXhwb3J0IHsgTGluZUNhcCwgTGluZUpvaW4sIFBsYW5lVmlldywgQXhpcyB9IGZyb20gJ0Bjb25zdGFudHMnO1xuZXhwb3J0IHsgSXNvbWV0cmljQ2FudmFzIH0gZnJvbSAnQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY0NhbnZhcyc7XG5leHBvcnQgeyBJc29tZXRyaWNHcm91cCB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNHcm91cCc7XG5leHBvcnQgeyBJc29tZXRyaWNSZWN0YW5nbGUgfSBmcm9tICdAY2xhc3Nlcy9wdWJsaWMvSXNvbWV0cmljUmVjdGFuZ2xlJztcbmV4cG9ydCB7IElzb21ldHJpY0NpcmNsZSB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNDaXJjbGUnO1xuZXhwb3J0IHsgSXNvbWV0cmljUGVudGFncmFtIH0gZnJvbSAnQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1BlbnRhZ3JhbSc7XG5leHBvcnQgeyBJc29tZXRyaWNTdGFyUG9seWdvbiB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNTdGFyUG9seWdvbic7XG5leHBvcnQgeyBJc29tZXRyaWNQYXRoIH0gZnJvbSAnQGNsYXNzZXMvcHVibGljL0lzb21ldHJpY1BhdGgnO1xuZXhwb3J0IHsgSXNvbWV0cmljVGV4dCB9IGZyb20gJ0BjbGFzc2VzL3B1YmxpYy9Jc29tZXRyaWNUZXh0JztcbiIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljUmVjdGFuZ2xlLCBQbGFuZVZpZXcgfSA9IElzb21ldHJpY01vZHVsZTtcblxuICAgIGZ1bmN0aW9uIHRvZ2dsZUNvbG9yKCkge1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IHRoaXMuZmlsbENvbG9yID09PSAnd2hpdGUnID8gJyNFRUUnIDogJ3doaXRlJztcbiAgICB9XG5cbiAgICBjb25zdCBjdWJlID0gbmV3IElzb21ldHJpY0NhbnZhcyh7XG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0NDQycsXG4gICAgICAgIHNjYWxlOiAxMjAsXG4gICAgICAgIHdpZHRoOiA1MDAsXG4gICAgICAgIGhlaWdodDogMzIwXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21tb25Qcm9wcyA9IHtoZWlnaHQ6IDEsIHdpZHRoOiAxfTtcbiAgICBjb25zdCB0b3BQaWVjZSA9IG5ldyBJc29tZXRyaWNSZWN0YW5nbGUoey4uLmNvbW1vblByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5UT1B9KTtcbiAgICBjb25zdCByaWdodFBpZWNlID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7Li4uY29tbW9uUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LkZST05UfSk7XG4gICAgY29uc3QgbGVmdFBpZWNlID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7Li4uY29tbW9uUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LlNJREV9KTtcblxuICAgIHRvcFBpZWNlLnRvcCA9IDE7XG4gICAgdG9wUGllY2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVDb2xvciwgdHJ1ZSk7XG5cbiAgICByaWdodFBpZWNlLnJpZ2h0ID0gMTtcbiAgICByaWdodFBpZWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlQ29sb3IsIHRydWUpO1xuXG4gICAgbGVmdFBpZWNlLmxlZnQgPSAxO1xuICAgIGxlZnRQaWVjZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUNvbG9yLCB0cnVlKTtcblxuICAgIGN1YmVcbiAgICAgICAgLmFkZENoaWxkKHRvcFBpZWNlKVxuICAgICAgICAuYWRkQ2hpbGQocmlnaHRQaWVjZSlcbiAgICAgICAgLmFkZENoaWxkKGxlZnRQaWVjZSk7XG5cbn07IiwiZXhwb3J0IGRlZmF1bHQgKCBJc29tZXRyaWNNb2R1bGUsIGNvbnRhaW5lciApID0+IHtcblxuICAgIGNvbnN0IHsgSXNvbWV0cmljQ2FudmFzLCBJc29tZXRyaWNQYXRoLCBJc29tZXRyaWNSZWN0YW5nbGUsIElzb21ldHJpY1BlbnRhZ3JhbSwgUGxhbmVWaWV3IH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBjdWJlID0gbmV3IElzb21ldHJpY0NhbnZhcyh7XG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0NDQycsXG4gICAgICAgIHNjYWxlOiAxMjAsXG4gICAgICAgIHdpZHRoOiA1MDAsXG4gICAgICAgIGhlaWdodDogMzIwXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21tb25Qcm9wcyA9IHtoZWlnaHQ6IDEsIHdpZHRoOiAxfTtcblxuICAgIGNvbnN0IGR1cmF0aW9uID0gMztcblxuICAgIGNvbnN0IHJlY3RhbmdsZUFuaW1hdGlvblByb3BzID0ge1xuICAgICAgICBwcm9wZXJ0eTogJ2hlaWdodCcsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICB2YWx1ZXM6IFsxLCAwLjUsIDFdXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbG9yQW5pbWF0aW9uUHJvcHMgPSB7XG4gICAgICAgIHByb3BlcnR5OiAnZmlsbENvbG9yJyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHZhbHVlczogWycjRkZGJywgJyNEREQnLCAnI0ZGRiddXG4gICAgfTtcblxuICAgIGNvbnN0IHRvcFBpZWNlID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCBzdGFyID0gbmV3IElzb21ldHJpY1BlbnRhZ3JhbSh7IHJhZGl1czogMC4zNSwgcGxhbmVWaWV3OiBQbGFuZVZpZXcuVE9QLCByaWdodDogMC41LCBsZWZ0OiAwLjUsIHRvcDogMX0pO1xuICAgIGNvbnN0IHJpZ2h0UGllY2UgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsuLi5jb21tb25Qcm9wcywgcGxhbmVWaWV3OiBQbGFuZVZpZXcuRlJPTlQsIHJpZ2h0OiAxfSk7XG4gICAgY29uc3QgbGVmdFBpZWNlID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7Li4uY29tbW9uUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LlNJREUsIGxlZnQ6IDF9KTtcblxuICAgIHRvcFBpZWNlXG4gICAgICAgIC5tb3ZlVG8oMCwgMCwgMSlcbiAgICAgICAgLmxpbmVUbygxLCAwLCAxKVxuICAgICAgICAubGluZVRvKDEsIDEsIDEpXG4gICAgICAgIC5saW5lVG8oMCwgMSwgMSk7XG5cbiAgICB0b3BQaWVjZVxuICAgICAgICAuYWRkQW5pbWF0aW9uKHtcbiAgICAgICAgICAgIHByb3BlcnR5OiAncGF0aCcsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICAgICdNMCAwIDEgTDEgMCAxIEwxIDEgMSBMMCAxIDEnLFxuICAgICAgICAgICAgICAgICdNMCAwIDAuNSBMMSAwIDAuNSBMMSAxIDAuNSBMMCAxIDAuNScsXG4gICAgICAgICAgICAgICAgJ00wIDAgMSBMMSAwIDEgTDEgMSAxIEwwIDEgMSdcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgICAgLmFkZEFuaW1hdGlvbihjb2xvckFuaW1hdGlvblByb3BzKTtcblxuICAgIHN0YXJcbiAgICAgICAgLmFkZEFuaW1hdGlvbih7XG4gICAgICAgICAgICBwcm9wZXJ0eTogJ3RvcCcsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHZhbHVlczogWzEsIDAuNSwgMV1cbiAgICAgICAgfSk7XG5cbiAgICByaWdodFBpZWNlXG4gICAgICAgIC5hZGRBbmltYXRpb24ocmVjdGFuZ2xlQW5pbWF0aW9uUHJvcHMpXG4gICAgICAgIC5hZGRBbmltYXRpb24oY29sb3JBbmltYXRpb25Qcm9wcyk7XG5cbiAgICBsZWZ0UGllY2VcbiAgICAgICAgLmFkZEFuaW1hdGlvbihyZWN0YW5nbGVBbmltYXRpb25Qcm9wcylcbiAgICAgICAgLmFkZEFuaW1hdGlvbihjb2xvckFuaW1hdGlvblByb3BzKTtcblxuICAgIGN1YmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2VBbmltYXRpb25zKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZUFuaW1hdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY3ViZS5hZGRDaGlsZHJlbih0b3BQaWVjZSwgcmlnaHRQaWVjZSwgbGVmdFBpZWNlLCBzdGFyKTtcblxufTsiLCJpbXBvcnQgJy4uL2ltYWdlcy9ibG9ja19zaWRlLnBuZyc7XG5pbXBvcnQgJy4uL2ltYWdlcy9ibG9ja190b3AucG5nJztcblxuZXhwb3J0IGRlZmF1bHQgKCBJc29tZXRyaWNNb2R1bGUsIGNvbnRhaW5lciApID0+IHtcblxuICAgIGNvbnN0IHsgSXNvbWV0cmljQ2FudmFzLCBJc29tZXRyaWNSZWN0YW5nbGUsIElzb21ldHJpY1RleHQsIFBsYW5lVmlldyB9ID0gSXNvbWV0cmljTW9kdWxlO1xuXG4gICAgY29uc3QgY3ViZSA9IG5ldyBJc29tZXRyaWNDYW52YXMoe1xuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNDQ0MnLFxuICAgICAgICBzY2FsZTogMTIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVjdGFuZ2xlQ29tbW9uUHJvcHMgPSB7IGhlaWdodDogMSwgd2lkdGg6IDEgfTtcblxuICAgIGNvbnN0IHRleHRDb21tb25Qcm9wcyA9IHtcbiAgICAgICAgZm9udFNpemU6IDE1LFxuICAgICAgICBmaWxsQ29sb3I6ICcjNjY2JyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAsXG4gICAgICAgIHJpZ2h0OiAwLjUsXG4gICAgICAgIGxlZnQ6IDAuNSxcbiAgICAgICAgdG9wOiAwLjUsXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGNvbnN0IHBpZWNlcyA9IFtQbGFuZVZpZXcuVE9QLCBQbGFuZVZpZXcuRlJPTlQsIFBsYW5lVmlldy5TSURFXS5tYXAoKHZpZXcsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmYWNlOiBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsuLi5yZWN0YW5nbGVDb21tb25Qcm9wcywgcGxhbmVWaWV3OiB2aWV3fSksXG4gICAgICAgICAgICBsYWJlbDogbmV3IElzb21ldHJpY1RleHQoey4uLnRleHRDb21tb25Qcm9wcywgcGxhbmVWaWV3OiB2aWV3fSksXG4gICAgICAgICAgICBwcm9wZXJ0eTogWyd0b3AnLCAncmlnaHQnLCAnbGVmdCddW2luZGV4XVxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgcGllY2VzLmZvckVhY2goKHBpZWNlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgeyBmYWNlLCBsYWJlbCwgcHJvcGVydHkgfSA9IHBpZWNlO1xuXG4gICAgICAgIGZhY2VbcHJvcGVydHldID0gMTtcbiAgICAgICAgbGFiZWxbcHJvcGVydHldID0gMTtcbiAgICAgICAgbGFiZWwudGV4dCA9IGAke3Byb3BlcnR5LnRvVXBwZXJDYXNlKCl9IDDCumA7XG5cbiAgICAgICAgZmFjZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uID0gbGFiZWwucm90YXRpb24gKyA0NTtcbiAgICAgICAgICAgIGxhYmVsLnJvdGF0aW9uID0gcm90YXRpb24gPT09IDM2MCA/IDAgOiByb3RhdGlvbjtcbiAgICAgICAgICAgIGxhYmVsLnRleHQgPSBsYWJlbC50ZXh0LnJlcGxhY2UoL1xcZCsvLCBsYWJlbC5yb3RhdGlvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1YmUuYWRkQ2hpbGQocGllY2UuZmFjZSk7XG4gICAgICAgIGN1YmUuYWRkQ2hpbGQocGllY2UubGFiZWwpO1xuICAgIH0pO1xuXG59OyIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljR3JvdXAsIElzb21ldHJpY1BhdGggfSA9IElzb21ldHJpY01vZHVsZTtcblxuICAgIGNvbnN0IGlzb21ldHJpYyA9IG5ldyBJc29tZXRyaWNDYW52YXMoe1xuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNDQ0MnLFxuICAgICAgICBzY2FsZTogMTIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm90dG9tVCA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG4gICAgY29uc3QgYm90dG9tUiA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG4gICAgY29uc3QgYm90dG9tTCA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG5cbiAgICBjb25zdCB0b3BUID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3BSID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3BMID0gbmV3IElzb21ldHJpY1BhdGgoKTtcblxuICAgIGJvdHRvbVQubXQoMCwgMCwgLjUpLmx0KDEsIDAsIC41KS5sdCgxLCAxLCAuNSkubHQoMCwgMSwgLjUpO1xuICAgIGJvdHRvbVIubXQoMSwgMCwgLjUpLmx0KDEsIDAsIDApLmx0KDEsIDEsIDApLmx0KDEsIDEsIC41KTtcbiAgICBib3R0b21MLm10KDEsIDEsIC41KS5sdCgxLCAxLCAwKS5sdCgwLCAxLCAwKS5sdCgwLCAxLCAuNSk7XG5cbiAgICB0b3BULm10KC4yNSwgLjI1LCAxKS5sdCguNzUsIC4yNSwgMSkubHQoLjc1LCAuNzUsIC43NSkubHQoLjI1LCAuNzUsIC43NSk7XG4gICAgdG9wUi5tdCguNzUsIC4yNSwgMSkubHQoLjc1LCAuNzUsIC43NSkubHQoLjc1LCAuNzUsIC4yNSkubHQoLjc1LCAuMjUsIC4yNSk7XG4gICAgdG9wTC5tdCguNzUsIC43NSwgLjc1KS5sdCguMjUsIC43NSwgLjc1KS5sdCguMjUsIC43NSwgLjI1KS5sdCguNzUsIC43NSwgLjI1KTtcblxuICAgIGNvbnN0IGJvdHRvbVBpZWNlID0gbmV3IElzb21ldHJpY0dyb3VwKCk7XG4gICAgY29uc3QgdG9wUGllY2UgPSBuZXcgSXNvbWV0cmljR3JvdXAoKTtcbiAgICB0b3BQaWVjZS50b3AgPSAuMjU7XG5cbiAgICBib3R0b21QaWVjZS5hZGRDaGlsZHJlbihib3R0b21ULCBib3R0b21SLCBib3R0b21MKTtcbiAgICB0b3BQaWVjZS5hZGRDaGlsZHJlbih0b3BULCB0b3BSLCB0b3BMKTtcblxuICAgIGxldCBmbGlwID0gdHJ1ZTtcblxuICAgIHRvcFBpZWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnJpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0ID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJpZ2h0ID0gZmxpcCA/IDAuMjUgOiAtMC4yNTtcbiAgICAgICAgZmxpcCA9ICFmbGlwO1xuICAgIH0pO1xuXG4gICAgaXNvbWV0cmljLmFkZENoaWxkcmVuKGJvdHRvbVBpZWNlLCB0b3BQaWVjZSk7XG5cbn07IiwiZXhwb3J0IGRlZmF1bHQgKCBJc29tZXRyaWNNb2R1bGUsIGNvbnRhaW5lciApID0+IHtcblxuICAgIGNvbnN0IHsgSXNvbWV0cmljQ2FudmFzLCBJc29tZXRyaWNQYXRoIH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBpc29tZXRyaWMgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjQ0NDJyxcbiAgICAgICAgc2NhbGU6IDEyMCxcbiAgICAgICAgd2lkdGg6IDUwMCxcbiAgICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9KTtcblxuICAgIGNvbnN0IHJpZ2h0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3AxID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3AyID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3AzID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCB0b3A0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCBsZWZ0MSA9IG5ldyBJc29tZXRyaWNQYXRoKCk7XG4gICAgY29uc3QgbGVmdDIgPSBuZXcgSXNvbWV0cmljUGF0aCgpO1xuXG4gICAgLy8gTSByIGwgdCAoTW92ZSB0byByaWdodCBsZWZ0IHRvcClcbiAgICAvLyBMIHIgbCB0IChMaW5lIHRvIHJpZ2h0IGxlZnQgdG9wKVxuICAgIC8vIEMgY3IgY2wgY3QgciBsIHQgKEN1cnZlIHRvIGNvbnRyb2wtcmlnaHQgY29udHJvbC1sZWZ0IGNvbnRyb2wtdG9wIHJpZ2h0IGxlZnQgdG9wKVxuICAgIHJpZ2h0LmRyYXcoJ00xIDAgMCBMMSAxIDAgTDEgMSAwLjI1IEwxIDAuNSAwLjI1IEwxIDAuNSAxIEwxIDAgMScpO1xuICAgIHRvcDEuZHJhdygnTTAuMjUgMC41IDEgQzAuNSAwLjUgMC43NSAwLjc1IDAuNSAxIEwwLjc1IDAgMSBDMC41IDAgMC43NSAwLjI1IDAgMSBMMC4yNSAwLjUgMScpO1xuICAgIHRvcDIuZHJhdygnTTEgMCAxIEwwLjc1IDAgMSBMMC43NSAwLjUgMSBMMSAwLjUgMSBMMSAwIDEgTTAgMCAxIEwwLjI1IDAgMSBMMC4yNSAwLjUgMSBMMCAwLjUgMSBMMCAwIDEnKTtcbiAgICB0b3AzLmRyYXcoJ00wIDAuNSAwLjUgTDAuNSAwLjUgMC41IEwwLjUgMSAwLjUgTDAgMSAwLjUnKTtcbiAgICB0b3A0LmRyYXcoJ00wLjUgMC41IDAuNSBMMSAwLjUgMC4yNSBMMSAxIDAuMjUgTDAuNSAxIDAuNScpO1xuICAgIGxlZnQxLmRyYXcoJ00wIDAuNSAxIEwwIDAuNSAwLjUgTDAuNSAwLjUgMC41IEwxIDAuNSAwLjI1IEwxIDAuNSAxIEwwLjc1IDAuNSAxIEMwLjUgMC41IDAuNzUgMC4yNSAwLjUgMSBMMCAwLjUgMScpO1xuICAgIGxlZnQyLmRyYXcoJ00wIDEgMC41IEwwLjUgMSAwLjUgTDEgMSAwLjI1IEwxIDEgMCBMMCAxIDAnKTtcblxuICAgIGlzb21ldHJpYy5hZGRDaGlsZHJlbihyaWdodCwgdG9wMSwgdG9wMiwgdG9wMywgdG9wNCwgbGVmdDEsIGxlZnQyKTtcblxufTsiLCJleHBvcnQgZGVmYXVsdCAoIElzb21ldHJpY01vZHVsZSwgY29udGFpbmVyICkgPT4ge1xuXG4gICAgY29uc3QgeyBJc29tZXRyaWNDYW52YXMsIElzb21ldHJpY1BhdGggfSA9IElzb21ldHJpY01vZHVsZTtcblxuICAgIGNvbnN0IGN1YmUgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjQ0NDJyxcbiAgICAgICAgc2NhbGU6IDEyMCxcbiAgICAgICAgd2lkdGg6IDUwMCxcbiAgICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuZGVyID0gbmV3IElzb21ldHJpY1BhdGgoeyBmaWxsQ29sb3I6ICcjRUVFJyB9KTtcbiAgICBjb25zdCB0b3AgPSBuZXcgSXNvbWV0cmljUGF0aCgpO1xuICAgIGNvbnN0IHJpZ2h0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcbiAgICBjb25zdCBsZWZ0ID0gbmV3IElzb21ldHJpY1BhdGgoKTtcblxuICAgIHVuZGVyXG4gICAgICAgIC5tdCgwLCAwLCAxKVxuICAgICAgICAubXQoMC4yNSwgMCwgMSkuY3QoMC41LCAwLCAwLjc1LCAwLjc1LCAwLCAxKS5sdCgxLCAwLCAxKVxuICAgICAgICAubHQoMSwgMCwgMC43NSkuY3QoMC43NSwgMCwgMC41LCAxLCAwLCAwLjI1KS5sdCgxLCAwLCAwKVxuICAgICAgICAubHQoMSwgMC4yNSwgMCkuY3QoMC43NSwgMC41LCAwLCAxLCAwLjc1LCAwKS5sdCgxLCAxLCAwKVxuICAgICAgICAubHQoMC43NSwgMSwgMCkuY3QoMC41LCAwLjc1LCAwLCAwLjI1LCAxLCAwKS5sdCgwLCAxLCAwKVxuICAgICAgICAubHQoMCwgMSwgMC4yNSkuY3QoMCwgMC43NSwgMC41LCAwLCAxLCAwLjc1KS5sdCgwLCAxLCAxKVxuICAgICAgICAubHQoMCwgMC43NSwgMSkuY3QoMCwgMC41LCAwLjc1LCAwLCAwLjI1LCAxKS5sdCgwLCAwLCAxKTtcblxuICAgIHRvcFxuICAgICAgICAubXQoMCwgMCwgMSlcbiAgICAgICAgLmx0KDAuMjUsIDAsIDEpLmN0KDAuNSwgMC4yNSwgMSwgMC43NSwgMCwgMSkubHQoMSwgMCwgMSlcbiAgICAgICAgLmx0KDEsIDAuMjUsIDEpLmN0KDAuNzUsIDAuNSwgMSwgMSwgMC43NSwgMSkubHQoMSwgMSwgMSlcbiAgICAgICAgLmx0KDAuNzUsIDEsIDEpLmN0KDAuNSwgMC43NSwgMSwgMC4yNSwgMSwgMSkubHQoMCwgMSwgMSlcbiAgICAgICAgLmx0KDAsIDAuNzUsIDEpLmN0KDAuMjUsIDAuNSwgMSwgMCwgMC4yNSwgMSkubHQoMCwgMCwgMSk7XG5cbiAgICByaWdodFxuICAgICAgICAubXQoMSwgMCwgMSlcbiAgICAgICAgLmx0KDEsIDAsIDAuNzUpLmN0KDEsIDAuMjUsIDAuNSwgMSwgMCwgMC4yNSkubHQoMSwgMCwgMClcbiAgICAgICAgLmx0KDEsIDAuMjUsIDApLmN0KDEsIDAuNSwgMC4yNSwgMSwgMC43NSwgMCkubHQoMSwgMSwgMClcbiAgICAgICAgLmx0KDEsIDEsIDAuMjUpLmN0KDEsIDAuNzUsIDAuNSwgMSwgMSwgMC43NSkubHQoMSwgMSwgMSlcbiAgICAgICAgLmx0KDEsIDAuNzUsIDEpLmN0KDEsIDAuNSwgMC43NSwgMSwgMC4yNSwgMSkubHQoMSwgMCwgMSk7XG5cbiAgICBsZWZ0XG4gICAgICAgIC5tdCgxLCAxLCAxKVxuICAgICAgICAubHQoMSwgMSwgMC43NSkuY3QoMC43NSwgMSwgMC41LCAxLCAxLCAwLjI1KS5sdCgxLCAxLCAwKVxuICAgICAgICAubHQoMC43NSwgMSwgMCkuY3QoMC41LCAxLCAwLjI1LCAwLjI1LCAxLCAwKS5sdCgwLCAxLCAwKVxuICAgICAgICAubHQoMCwgMSwgMC4yNSkuY3QoMC4yNSwgMSwgMC41LCAwLCAxLCAwLjc1KS5sdCgwLCAxLCAxKVxuICAgICAgICAubHQoMC4yNSwgMSwgMSkuY3QoMC41LCAxLCAwLjc1LCAwLjc1LCAxLCAxKS5sdCgxLCAxLCAxKTtcblxuICAgIGN1YmUuYWRkQ2hpbGRyZW4odW5kZXIsIHRvcCwgcmlnaHQsIGxlZnQpO1xuXG59OyIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljU3RhclBvbHlnb24sIFBsYW5lVmlldyB9ID0gSXNvbWV0cmljTW9kdWxlO1xuXG4gICAgY29uc3QgY3ViZSA9IG5ldyBJc29tZXRyaWNDYW52YXMoe1xuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNDQ0MnLFxuICAgICAgICBzY2FsZTogMTIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICAgIHJhZGl1czogMC41LFxuICAgICAgICBwb2ludHM6IDgsXG4gICAgICAgIGRlbnNpdHk6IDIsXG4gICAgICAgIHJpZ2h0OiAwLjUsXG4gICAgICAgIGxlZnQ6IDAuNSxcbiAgICAgICAgdG9wOiAwLjVcbiAgICB9O1xuXG4gICAgY29uc3QgcGxhbmVzID0gW1BsYW5lVmlldy5TSURFLCBQbGFuZVZpZXcuRlJPTlQsIFBsYW5lVmlldy5UT1BdO1xuXG4gICAgY29uc3QgcGxhbmVQcm9wc0hhc2ggPSB7XG4gICAgICAgIFtQbGFuZVZpZXcuVE9QXTogJ3RvcCcsXG4gICAgICAgIFtQbGFuZVZpZXcuRlJPTlRdOiAncmlnaHQnLFxuICAgICAgICBbUGxhbmVWaWV3LlNJREVdOiAnbGVmdCdcbiAgICB9O1xuXG4gICAgcGxhbmVzLmZvckVhY2goKHBsYW5lVmlldykgPT4ge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uY29tbW9uUHJvcHMsIHBsYW5lVmlldyB9O1xuICAgICAgICBjb25zdCBjb29yZCA9IHBsYW5lUHJvcHNIYXNoW3BsYW5lVmlld107XG4gICAgICAgIGNvbnN0IHN0YXJQb2x5Z29uQmFjayA9IG5ldyBJc29tZXRyaWNTdGFyUG9seWdvbih7Li4ucHJvcHMsIGlkOiBgJHtjb29yZH0tYmFja2AsIGZpbGxDb2xvcjogJyNFRUUnfSk7XG4gICAgICAgIGNvbnN0IHN0YXJQb2x5Z29uRnJvbnQgPSBuZXcgSXNvbWV0cmljU3RhclBvbHlnb24oey4uLnByb3BzLCBpZDogYCR7Y29vcmR9LWZyb250YH0pO1xuICAgICAgICBzdGFyUG9seWdvbkJhY2tbY29vcmRdID0gMDtcbiAgICAgICAgc3RhclBvbHlnb25Gcm9udFtjb29yZF0gPSAxO1xuICAgICAgICBjdWJlLmFkZENoaWxkcmVuKHN0YXJQb2x5Z29uQmFjaywgc3RhclBvbHlnb25Gcm9udCk7XG4gICAgfSk7XG5cbiAgICBwbGFuZXMuZm9yRWFjaCgocGxhbmVWaWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gcGxhbmVQcm9wc0hhc2hbcGxhbmVWaWV3XTtcbiAgICAgICAgY29uc3Qgc3RhclBvbHlnb25CYWNrID0gY3ViZS5nZXRDaGlsZEJ5SWQoYCR7Y29vcmR9LWJhY2tgKTtcbiAgICAgICAgY29uc3Qgc3RhclBvbHlnb25Gcm9udCA9IGN1YmUuZ2V0Q2hpbGRCeUlkKGAke2Nvb3JkfS1mcm9udGApO1xuICAgICAgICBjdWJlLnNlbmRDaGlsZFRvQmFjayhzdGFyUG9seWdvbkJhY2spO1xuICAgICAgICBjdWJlLmJyaW5nQ2hpbGRUb0Zyb250KHN0YXJQb2x5Z29uRnJvbnQpO1xuICAgIH0pO1xuXG59OyIsImV4cG9ydCBkZWZhdWx0ICggSXNvbWV0cmljTW9kdWxlLCBjb250YWluZXIgKSA9PiB7XG5cbiAgICBjb25zdCB7IElzb21ldHJpY0NhbnZhcywgSXNvbWV0cmljR3JvdXAsIElzb21ldHJpY1JlY3RhbmdsZSwgUGxhbmVWaWV3IH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBjYW52YXMgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjQ0NDJyxcbiAgICAgICAgc2NhbGU6IDIwLFxuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDMyMFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gcmVzZXRQbGFuZXMoKSB7XG4gICAgICAgIGN1YmUucmlnaHQgPSBjdWJlLmxlZnQgPSBjdWJlLnRvcCA9IDA7XG4gICAgICAgIHBsYW5lVG9wLmZpbGxPcGFjaXR5ID0gcGxhbmVSaWdodC5maWxsT3BhY2l0eSA9IHBsYW5lTGVmdC5maWxsT3BhY2l0eSA9IDAuMjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hhbmdlUGxhbmUoKSB7XG4gICAgICAgIHJlc2V0UGxhbmVzKCk7XG4gICAgICAgIHRoaXMuZmlsbE9wYWNpdHkgPSAxO1xuICAgICAgICBjdWJlLmRyYWcgPSB0aGlzLnBsYW5lVmlldztcbiAgICB9XG5cbiAgICBjb25zdCBwbGFuZVByb3BzID0geyBoZWlnaHQ6IDYsIHdpZHRoOiA2LCBmaWxsT3BhY2l0eTogMC4yNSB9O1xuICAgIGNvbnN0IHBsYW5lVG9wID0gbmV3IElzb21ldHJpY1JlY3RhbmdsZSh7IC4uLnBsYW5lUHJvcHMsIHBsYW5lVmlldzogUGxhbmVWaWV3LlRPUCwgZmlsbE9wYWNpdHk6IDEgfSk7XG4gICAgY29uc3QgcGxhbmVSaWdodCA9IG5ldyBJc29tZXRyaWNSZWN0YW5nbGUoeyAuLi5wbGFuZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5GUk9OVCB9KTtcbiAgICBjb25zdCBwbGFuZUxlZnQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4ucGxhbmVQcm9wcywgcGxhbmVWaWV3OiBQbGFuZVZpZXcuU0lERSB9KTtcblxuICAgIGNvbnN0IGN1YmVQcm9wcyA9IHsgaGVpZ2h0OiAxLCB3aWR0aDogMSB9O1xuICAgIGNvbnN0IGN1YmVUb3AgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4uY3ViZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5UT1AsIHRvcDogMSB9KTtcbiAgICBjb25zdCBjdWJlUmlnaHQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4uY3ViZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5GUk9OVCwgcmlnaHQ6IDEgfSk7XG4gICAgY29uc3QgY3ViZUxlZnQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHsgLi4uY3ViZVByb3BzLCBwbGFuZVZpZXc6IFBsYW5lVmlldy5TSURFLCBsZWZ0OiAxIH0pO1xuXG4gICAgY29uc3QgY3ViZSA9IG5ldyBJc29tZXRyaWNHcm91cCgpO1xuXG4gICAgY29uc3QgYm91bmRzID0gWzAsIDVdO1xuICAgIGN1YmUuZHJhZyA9ICdUT1AnO1xuICAgIGN1YmUuYm91bmRzID0geyB0b3A6IGJvdW5kcywgcmlnaHQ6IGJvdW5kcywgbGVmdDogYm91bmRzIH07XG5cbiAgICBwbGFuZVRvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYW5nZVBsYW5lLCB0cnVlKTtcbiAgICBwbGFuZVJpZ2h0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hhbmdlUGxhbmUsIHRydWUpO1xuICAgIHBsYW5lTGVmdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYW5nZVBsYW5lLCB0cnVlKTtcblxuICAgIGN1YmUuYWRkQ2hpbGRyZW4oY3ViZVRvcCwgY3ViZVJpZ2h0LCBjdWJlTGVmdCk7XG4gICAgY2FudmFzLmFkZENoaWxkcmVuKHBsYW5lVG9wLCBwbGFuZVJpZ2h0LCBwbGFuZUxlZnQsIGN1YmUpO1xuXG59OyIsImltcG9ydCAnLi4vaW1hZ2VzL2Jsb2NrX3NpZGUucG5nJztcbmltcG9ydCAnLi4vaW1hZ2VzL2Jsb2NrX3RvcC5wbmcnO1xuXG5leHBvcnQgZGVmYXVsdCAoIElzb21ldHJpY01vZHVsZSwgY29udGFpbmVyICkgPT4ge1xuXG4gICAgY29uc3QgeyBJc29tZXRyaWNDYW52YXMsIElzb21ldHJpY1BhdGgsIElzb21ldHJpY1JlY3RhbmdsZSwgUGxhbmVWaWV3LCBBeGlzIH0gPSBJc29tZXRyaWNNb2R1bGU7XG5cbiAgICBjb25zdCBpc29tZXRyaWMgPSBuZXcgSXNvbWV0cmljQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjOEFBQTNGJyxcbiAgICAgICAgc2NhbGU6IDEyMCxcbiAgICAgICAgd2lkdGg6IDUwMCxcbiAgICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbW1vblRleHR1cmVQcm9wcyA9IHtcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgcGl4ZWxhdGVkOiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0IHRleHR1cmVTaWRlcyA9IHtcbiAgICAgICAgdXJsOiAnaW1hZ2VzL2Jsb2NrX3NpZGUucG5nJyxcbiAgICAgICAgLi4uY29tbW9uVGV4dHVyZVByb3BzXG4gICAgfTtcblxuICAgIGNvbnN0IHRleHR1cmVUb3AgPSB7XG4gICAgICAgIHVybDogJ2ltYWdlcy9ibG9ja190b3AucG5nJyxcbiAgICAgICAgcGxhbmVWaWV3OiBQbGFuZVZpZXcuVE9QLFxuICAgICAgICByb3RhdGlvbjoge1xuICAgICAgICAgICAgYXhpczogQXhpcy5MRUZULFxuICAgICAgICAgICAgdmFsdWU6IDI2LjU2NTBcbiAgICAgICAgfSxcbiAgICAgICAgLi4uY29tbW9uVGV4dHVyZVByb3BzXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZGUgPSBuZXcgSXNvbWV0cmljUGF0aCh7XG4gICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHBsYW5lVmlldzogUGxhbmVWaWV3LlNJREUsXG4gICAgICAgICAgICAuLi50ZXh0dXJlU2lkZXNcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZnJvbnQgPSBuZXcgSXNvbWV0cmljUmVjdGFuZ2xlKHtcbiAgICAgICAgcGxhbmVWaWV3OiBQbGFuZVZpZXcuRlJPTlQsXG4gICAgICAgIGhlaWdodDogMC41LFxuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgdGV4dHVyZTogdGV4dHVyZVNpZGVzXG4gICAgfSk7XG5cbiAgICBjb25zdCBjaG9wID0gbmV3IElzb21ldHJpY1BhdGgoe1xuICAgICAgICB0ZXh0dXJlOiB0ZXh0dXJlVG9wXG4gICAgfSk7XG5cbiAgICBzaWRlLmRyYXcoJ00xIDEgMCBMMSAxIDAuNSBMMCAxIDEgTDAgMSAwJyk7XG4gICAgY2hvcC5kcmF3KCdNMSAxIDAuNSBMMCAxIDEgTDAgMCAxIEwxIDAgMC41Jyk7XG5cbiAgICBzaWRlLmxlZnQgPSAxO1xuICAgIGZyb250LnJpZ2h0ID0gMTtcblxuICAgIGlzb21ldHJpYy5hZGRDaGlsZHJlbihzaWRlLCBmcm9udCwgY2hvcCk7XG5cbn07IiwiaW1wb3J0ICdnb29nbGUtY29kZS1wcmV0dGlmeS9iaW4vcnVuX3ByZXR0aWZ5Lm1pbic7XG5pbXBvcnQgJy4uL25vZGVfbW9kdWxlcy9nb29nbGUtY29kZS1wcmV0dGlmeS9iaW4vcHJldHRpZnkubWluLmNzcyc7XG5pbXBvcnQgJy4vdG9tb3Jyb3cubWluLmNzcyc7XG5pbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuaW1wb3J0ICogYXMgSXNvbWV0cmljTW9kdWxlIGZyb20gJy4uL3NyYyc7XG5pbXBvcnQgZGVtbzEgZnJvbSAnLi9kZW1vMSc7XG5pbXBvcnQgZGVtbzIgZnJvbSAnLi9kZW1vMic7XG5pbXBvcnQgZGVtbzMgZnJvbSAnLi9kZW1vMyc7XG5pbXBvcnQgZGVtbzQgZnJvbSAnLi9kZW1vNCc7XG5pbXBvcnQgZGVtbzUgZnJvbSAnLi9kZW1vNSc7XG5pbXBvcnQgZGVtbzYgZnJvbSAnLi9kZW1vNic7XG5pbXBvcnQgZGVtbzcgZnJvbSAnLi9kZW1vNyc7XG5pbXBvcnQgZGVtbzggZnJvbSAnLi9kZW1vOCc7XG5pbXBvcnQgZGVtbzkgZnJvbSAnLi9kZW1vOSc7XG5cbmNvbnN0IGZ1bmN0aW9Ub1N0cmluZyA9IChmbikgPT4ge1xuICAgIGNvbnN0IGFydGljbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhcnRpY2xlJyk7XG4gICAgY29uc3QgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgYXJ0aWNsZS5jbGFzc0xpc3QuYWRkKCdmdW5jdGlvbi1jb250YWluZXInKTtcbiAgICBwcmUuY2xhc3NMaXN0LmFkZCgncHJldHR5cHJpbnQnKTtcbiAgICBhcnRpY2xlLmFwcGVuZENoaWxkKHByZSk7XG4gICAgcHJlLmlubmVySFRNTCA9IGZuLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFydGljbGU7XG59O1xuXG5jb25zdCBkZW1vcyA9IG5ldyBNYXAoW1xuICAgIFsnZGVtbzEnLCBkZW1vMV0sXG4gICAgWydkZW1vMicsIGRlbW8yXSxcbiAgICBbJ2RlbW8zJywgZGVtbzNdLFxuICAgIFsnZGVtbzQnLCBkZW1vNF0sXG4gICAgWydkZW1vNScsIGRlbW81XSxcbiAgICBbJ2RlbW82JywgZGVtbzZdLFxuICAgIFsnZGVtbzcnLCBkZW1vN10sXG4gICAgWydkZW1vOCcsIGRlbW84XSxcbiAgICBbJ2RlbW85JywgZGVtbzldLFxuXSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZW1vcy5mb3JFYWNoKChtb2R1bGUsIGRpdikgPT4ge1xuICAgICAgICBjb25zdCBkZW1vID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2KTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVtby1jb250YWluZXInKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkZW1vLXdyYXBwZXInKTtcblxuICAgICAgICBtb2R1bGUoSXNvbWV0cmljTW9kdWxlLCB3cmFwcGVyKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgICAgICBkZW1vLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgICAgIGRlbW8uYXBwZW5kQ2hpbGQoZnVuY3Rpb1RvU3RyaW5nKG1vZHVsZSkpO1xuICAgIH0pO1xuXG59KTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///239\n')},966:(module,exports)=>{eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(){var r=null;\n(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",\nw,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j=0;){var M=A[m],T=M.src.match(/^[^#?]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=\n[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-\na[0]||a[1]-f[1]});b=[];g=[];for(a=0;ak[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],g=0,k=0;g=2&&f==="["?a[g]=b(o):f!=="\\\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,\ng),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\\S\\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\\\]|\\\\[\\S\\s]|\'\'?(?=[^\']))*(?:\'\'\'|$)|"""(?:[^"\\\\]|\\\\[\\S\\s]|""?(?=[^"]))*(?:"""|$)|\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$))/,\nr,"\'\\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,r,"\'\\"`"]):d.push(["str",/^(?:\'(?:[^\\n\\r\'\\\\]|\\\\.)*(?:\'|$)|"(?:[^\\n\\r"\\\\]|\\\\.)*(?:"|$))/,r,"\\"\'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,\nr,"#"]),h.push(["str",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,r])):d.push(["com",/^#[^\\n\\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\\/\\/[^\\n\\r]*/,r]),h.push(["com",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\\n\\r")?".":"[\\\\S\\\\s]";h.push(["lang-regex",RegExp("^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*("+\n("/(?=[^/*"+b+"])(?:[^/\\\\x5B\\\\x5C"+b+"]|\\\\x5C"+e+"|\\\\x5B(?:[^\\\\x5C\\\\x5D"+b+"]|\\\\x5C"+e+")*(?:\\\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\\s,]+/g,"|")+")\\\\b"),r]);d.push(["pln",/^\\s+/,r," \\r\\n\\t\\u00a0"]);b="^.[^\\\\s\\\\w.$@\'\\"`/\\\\\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,r],["pln",/^[$_a-z][\\w$@]*/i,r],["lit",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,\nr,"0123456789"],["pln",/^\\\\[\\S\\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}\nfunction e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\\s*=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],\n"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],\nL=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],\nN=[G,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nS=/\\S/,T=t({keywords:[J,L,O,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],["lang-",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],["lang-",/^<%([\\S\\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",\n/^]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],["lang-js",/^]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],["lang-css",/^]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],["lang-in.tag",/^(<\\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);i(C([["pln",/^\\s+/,r," \\t\\r\\n"],["atv",/^(?:"[^"]*"?|\'[^\']*\'?)/,r,"\\"\'"]],[["tag",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],["atn",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],["lang-uq.val",/^=\\s*([^\\s"\'>]*(?:[^\\s"\'/>]|\\/(?=\\s)))/],["pun",/^[/<->]+/],\n["lang-js",/^on\\w+\\s*=\\s*"([^"]+)"/i],["lang-js",/^on\\w+\\s*=\\s*\'([^\']+)\'/i],["lang-js",/^on\\w+\\s*=\\s*([^\\s"\'>]+)/i],["lang-css",/^style\\s*=\\s*"([^"]+)"/i],["lang-css",/^style\\s*=\\s*\'([^\']+)\'/i],["lang-css",/^style\\s*=\\s*([^\\s"\'>]+)/i]]),["in.tag"]);i(C([],[["atv",/^[\\S\\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),\n["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);i(t({keywords:N,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);\ni(C([],[["str",/^[\\S\\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},\nprettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p{for(var C in g)__webpack_require__.o(g,C)&&!__webpack_require__.o(I,C)&&Object.defineProperty(I,C,{enumerable:!0,get:g[C]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(I){if("object"==typeof window)return window}}(),__webpack_require__.o=(I,g)=>Object.prototype.hasOwnProperty.call(I,g),__webpack_require__.r=I=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},(()=>{var I;__webpack_require__.g.importScripts&&(I=__webpack_require__.g.location+"");var g=__webpack_require__.g.document;if(!I&&g&&(g.currentScript&&"SCRIPT"===g.currentScript.tagName.toUpperCase()&&(I=g.currentScript.src),!I)){var C=g.getElementsByTagName("script");if(C.length)for(var t=C.length-1;t>-1&&(!I||!/^http(s?):/.test(I));)I=C[t--].src}if(!I)throw new Error("Automatic publicPath is not supported in this browser");I=I.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),__webpack_require__.p=I+"../"})();var __webpack_exports__=__webpack_require__(239),__webpack_export_target__=window;for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__]=__webpack_exports__[__webpack_i__];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})(); \ No newline at end of file diff --git a/package.json b/package.json index 84895bc..8184a5e 100644 --- a/package.json +++ b/package.json @@ -75,29 +75,29 @@ "devDependencies": { "@rollup/plugin-terser": "^0.4.4", "@types/jest": "^29.5.14", - "@types/node": "^22.15.3", + "@types/node": "^22.15.17", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^13.0.0", "css-loader": "^7.1.2", "eslint": "^9.26.0", - "globals": "^16.0.0", + "globals": "^16.1.0", "google-code-prettify": "^1.0.5", "html-webpack-plugin": "^5.6.3", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "mini-css-extract-plugin": "^2.9.2", "rimraf": "^6.0.1", - "rollup": "^4.40.1", + "rollup": "^4.40.2", "rollup-plugin-ts": "^3.4.5", - "sass": "^1.87.0", + "sass": "^1.88.0", "sass-loader": "^16.0.5", "style-loader": "^4.0.0", "ts-jest": "^29.3.2", "ts-loader": "^9.5.2", "tslib": "^2.8.1", "typescript": "^5.8.3", - "typescript-eslint": "^8.31.1", - "webpack": "^5.99.7", + "typescript-eslint": "^8.32.0", + "webpack": "^5.99.8", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4170974..86e1a45 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,67 +14,67 @@ importers: devDependencies: '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.40.1) + version: 0.4.4(rollup@4.40.2) '@types/jest': specifier: ^29.5.14 version: 29.5.14 '@types/node': - specifier: ^22.15.3 - version: 22.15.3 + specifier: ^22.15.17 + version: 22.15.17 clean-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.99.7) + version: 4.0.0(webpack@5.99.8) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.7) + version: 13.0.0(webpack@5.99.8) css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.99.7) + version: 7.1.2(webpack@5.99.8) eslint: specifier: ^9.26.0 version: 9.26.0 globals: - specifier: ^16.0.0 - version: 16.0.0 + specifier: ^16.1.0 + version: 16.1.0 google-code-prettify: specifier: ^1.0.5 version: 1.0.5 html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.7) + version: 5.6.3(webpack@5.99.8) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.3) + version: 29.7.0(@types/node@22.15.17) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.9.2(webpack@5.99.7) + version: 2.9.2(webpack@5.99.8) rimraf: specifier: ^6.0.1 version: 6.0.1 rollup: - specifier: ^4.40.1 - version: 4.40.1 + specifier: ^4.40.2 + version: 4.40.2 rollup-plugin-ts: specifier: ^3.4.5 - version: 3.4.5(@babel/core@7.18.2)(rollup@4.40.1)(typescript@5.8.3) + version: 3.4.5(@babel/core@7.18.2)(rollup@4.40.2)(typescript@5.8.3) sass: - specifier: ^1.87.0 - version: 1.87.0 + specifier: ^1.88.0 + version: 1.88.0 sass-loader: specifier: ^16.0.5 - version: 16.0.5(sass@1.87.0)(webpack@5.99.7) + version: 16.0.5(sass@1.88.0)(webpack@5.99.8) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.99.7) + version: 4.0.0(webpack@5.99.8) ts-jest: specifier: ^29.3.2 - version: 29.3.2(@babel/core@7.18.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.18.2))(jest@29.7.0(@types/node@22.15.3))(typescript@5.8.3) + version: 29.3.2(@babel/core@7.18.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.18.2))(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.99.7) + version: 9.5.2(typescript@5.8.3)(webpack@5.99.8) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -82,17 +82,17 @@ importers: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.31.1 - version: 8.31.1(eslint@9.26.0)(typescript@5.8.3) + specifier: ^8.32.0 + version: 8.32.0(eslint@9.26.0)(typescript@5.8.3) webpack: - specifier: ^5.99.7 - version: 5.99.7(webpack-cli@6.0.1) + specifier: ^5.99.8 + version: 5.99.8(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7) + version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.1(webpack-cli@6.0.1)(webpack@5.99.7) + version: 5.2.1(webpack-cli@6.0.1)(webpack@5.99.8) packages: @@ -638,103 +638,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.1': - resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.1': - resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.1': - resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.1': - resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.1': - resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.1': - resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.1': - resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.1': - resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.1': - resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.1': - resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.1': - resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': - resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.1': - resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.1': - resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.1': - resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.1': - resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.1': - resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.1': - resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.1': - resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.1': - resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} cpu: [x64] os: [win32] @@ -835,8 +835,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.15.3': - resolution: {integrity: sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==} + '@types/node@22.15.17': + resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} '@types/object-path@0.11.1': resolution: {integrity: sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==} @@ -883,51 +883,51 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@8.31.1': - resolution: {integrity: sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==} + '@typescript-eslint/eslint-plugin@8.32.0': + resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.31.1': - resolution: {integrity: sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==} + '@typescript-eslint/parser@8.32.0': + resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.31.1': - resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==} + '@typescript-eslint/scope-manager@8.32.0': + resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.31.1': - resolution: {integrity: sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==} + '@typescript-eslint/type-utils@8.32.0': + resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.31.1': - resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==} + '@typescript-eslint/types@8.32.0': + resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.31.1': - resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==} + '@typescript-eslint/typescript-estree@8.32.0': + resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.31.1': - resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==} + '@typescript-eslint/utils@8.32.0': + resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.31.1': - resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==} + '@typescript-eslint/visitor-keys@8.32.0': + resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@webassemblyjs/ast@1.14.1': @@ -1194,8 +1194,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1243,8 +1243,8 @@ packages: caniuse-lite@1.0.30001707: resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} - caniuse-lite@1.0.30001715: - resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001717: + resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1577,8 +1577,8 @@ packages: electron-to-chromium@1.4.803: resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==} - electron-to-chromium@1.5.143: - resolution: {integrity: sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==} + electron-to-chromium@1.5.151: + resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -1931,8 +1931,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + globals@16.1.0: + resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} engines: {node: '>=18'} globby@6.1.0: @@ -2078,8 +2078,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - immutable@5.1.1: - resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==} + immutable@5.1.2: + resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -3048,8 +3048,8 @@ packages: '@swc/helpers': optional: true - rollup@4.40.1: - resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3097,8 +3097,8 @@ packages: webpack: optional: true - sass@1.87.0: - resolution: {integrity: sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==} + sass@1.88.0: + resolution: {integrity: sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==} engines: {node: '>=14.0.0'} hasBin: true @@ -3494,8 +3494,8 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typescript-eslint@8.31.1: - resolution: {integrity: sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==} + typescript-eslint@8.32.0: + resolution: {integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3626,8 +3626,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.99.7: - resolution: {integrity: sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==} + webpack@5.99.8: + resolution: {integrity: sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -3803,7 +3803,7 @@ snapshots: '@babel/compat-data': 7.17.10 '@babel/core': 7.18.2 '@babel/helper-validator-option': 7.16.7 - browserslist: 4.24.4 + browserslist: 4.24.5 semver: 6.3.1 '@babel/helper-environment-visitor@7.22.20': {} @@ -4078,7 +4078,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4091,14 +4091,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.3) + jest-config: 29.7.0(@types/node@22.15.17) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4123,7 +4123,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -4141,7 +4141,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 22.15.3 + '@types/node': 22.15.17 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4163,7 +4163,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.3 + '@types/node': 22.15.17 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4233,7 +4233,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -4388,80 +4388,80 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/plugin-terser@0.4.4(rollup@4.40.1)': + '@rollup/plugin-terser@0.4.4(rollup@4.40.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.4.1 terser: 5.27.0 optionalDependencies: - rollup: 4.40.1 + rollup: 4.40.2 - '@rollup/pluginutils@5.0.2(rollup@4.40.1)': + '@rollup/pluginutils@5.0.2(rollup@4.40.2)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.40.1 + rollup: 4.40.2 - '@rollup/rollup-android-arm-eabi@4.40.1': + '@rollup/rollup-android-arm-eabi@4.40.2': optional: true - '@rollup/rollup-android-arm64@4.40.1': + '@rollup/rollup-android-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-arm64@4.40.1': + '@rollup/rollup-darwin-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-x64@4.40.1': + '@rollup/rollup-darwin-x64@4.40.2': optional: true - '@rollup/rollup-freebsd-arm64@4.40.1': + '@rollup/rollup-freebsd-arm64@4.40.2': optional: true - '@rollup/rollup-freebsd-x64@4.40.1': + '@rollup/rollup-freebsd-x64@4.40.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.1': + '@rollup/rollup-linux-arm-musleabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.1': + '@rollup/rollup-linux-arm64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.1': + '@rollup/rollup-linux-arm64-musl@4.40.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.1': + '@rollup/rollup-linux-riscv64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.1': + '@rollup/rollup-linux-riscv64-musl@4.40.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.1': + '@rollup/rollup-linux-s390x-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.1': + '@rollup/rollup-linux-x64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-musl@4.40.1': + '@rollup/rollup-linux-x64-musl@4.40.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.1': + '@rollup/rollup-win32-arm64-msvc@4.40.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.1': + '@rollup/rollup-win32-ia32-msvc@4.40.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.1': + '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true '@sinclair/typebox@0.27.8': {} @@ -4500,20 +4500,20 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.6 - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/eslint-scope@3.7.7': dependencies: @@ -4529,7 +4529,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -4544,11 +4544,11 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 3.0.5 - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/graceful-fs@4.1.5': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/html-minifier-terser@6.1.0': {} @@ -4556,7 +4556,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/istanbul-lib-coverage@2.0.6': {} @@ -4575,7 +4575,7 @@ snapshots: '@types/jsdom@20.0.0': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/tough-cookie': 4.0.2 parse5: 7.2.1 @@ -4587,11 +4587,11 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/node@17.0.45': {} - '@types/node@22.15.3': + '@types/node@22.15.17': dependencies: undici-types: 6.21.0 @@ -4608,7 +4608,7 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/serve-index@1.9.4': dependencies: @@ -4617,12 +4617,12 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/stack-utils@2.0.3': {} @@ -4632,7 +4632,7 @@ snapshots: '@types/ws@8.18.0': dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 '@types/yargs-parser@21.0.3': {} @@ -4640,14 +4640,14 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.31.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.31.1 - '@typescript-eslint/type-utils': 8.31.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.31.1 + '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.0 + '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.0 eslint: 9.26.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -4657,27 +4657,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.31.1(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.31.1 - '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.31.1 + '@typescript-eslint/scope-manager': 8.32.0 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.0 debug: 4.4.0 eslint: 9.26.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.31.1': + '@typescript-eslint/scope-manager@8.32.0': dependencies: - '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/visitor-keys': 8.31.1 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/visitor-keys': 8.32.0 - '@typescript-eslint/type-utils@8.31.1(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) debug: 4.4.0 eslint: 9.26.0 ts-api-utils: 2.1.0(typescript@5.8.3) @@ -4685,12 +4685,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.31.1': {} + '@typescript-eslint/types@8.32.0': {} - '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/visitor-keys': 8.31.1 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/visitor-keys': 8.32.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4701,20 +4701,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.31.1(eslint@9.26.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.0(eslint@9.26.0)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) - '@typescript-eslint/scope-manager': 8.31.1 - '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.0 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) eslint: 9.26.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.31.1': + '@typescript-eslint/visitor-keys@8.32.0': dependencies: - '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/types': 8.32.0 eslint-visitor-keys: 4.2.0 '@webassemblyjs/ast@1.14.1': @@ -4793,22 +4793,22 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.7)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.8)': dependencies: - webpack: 5.99.7(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7) + webpack: 5.99.8(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.7)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.8)': dependencies: - webpack: 5.99.7(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7) + webpack: 5.99.8(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack@5.99.7)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack@5.99.8)': dependencies: - webpack: 5.99.7(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7) + webpack: 5.99.8(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8) optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.99.7) + webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.99.8) '@wessberg/stringutil@1.0.19': {} @@ -5044,12 +5044,12 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.21.10) - browserslist@4.24.4: + browserslist@4.24.5: dependencies: - caniuse-lite: 1.0.30001715 - electron-to-chromium: 1.5.143 + caniuse-lite: 1.0.30001717 + electron-to-chromium: 1.5.151 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.24.5) bs-logger@0.2.6: dependencies: @@ -5090,7 +5090,7 @@ snapshots: caniuse-lite@1.0.30001707: {} - caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001717: {} chalk@4.1.2: dependencies: @@ -5125,10 +5125,10 @@ snapshots: dependencies: source-map: 0.6.1 - clean-webpack-plugin@4.0.0(webpack@5.99.7): + clean-webpack-plugin@4.0.0(webpack@5.99.8): dependencies: del: 4.1.1 - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) cliui@7.0.4: dependencies: @@ -5213,14 +5213,14 @@ snapshots: cookie@0.7.2: {} - copy-webpack-plugin@13.0.0(webpack@5.99.7): + copy-webpack-plugin@13.0.0(webpack@5.99.8): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.0 serialize-javascript: 6.0.2 tinyglobby: 0.2.12 - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) core-util-is@1.0.3: {} @@ -5229,13 +5229,13 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - create-jest@29.7.0(@types/node@22.15.3): + create-jest@29.7.0(@types/node@22.15.17): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.3) + jest-config: 29.7.0(@types/node@22.15.17) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5254,7 +5254,7 @@ snapshots: dependencies: '@types/node': 17.0.45 - css-loader@7.1.2(webpack@5.99.7): + css-loader@7.1.2(webpack@5.99.8): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -5265,7 +5265,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.2 optionalDependencies: - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -5406,7 +5406,7 @@ snapshots: electron-to-chromium@1.4.803: {} - electron-to-chromium@1.5.143: {} + electron-to-chromium@1.5.151: {} emittery@0.13.1: {} @@ -5825,7 +5825,7 @@ snapshots: globals@14.0.0: {} - globals@16.0.0: {} + globals@16.1.0: {} globby@6.1.0: dependencies: @@ -5884,7 +5884,7 @@ snapshots: relateurl: 0.2.7 terser: 5.36.0 - html-webpack-plugin@5.6.3(webpack@5.99.7): + html-webpack-plugin@5.6.3(webpack@5.99.8): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -5892,7 +5892,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -5987,7 +5987,7 @@ snapshots: ignore@5.3.2: {} - immutable@5.1.1: {} + immutable@5.1.2: {} import-fresh@3.3.1: dependencies: @@ -6151,7 +6151,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 chalk: 4.1.2 co: 4.6.0 dedent: 1.3.0 @@ -6171,16 +6171,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.15.3): + jest-cli@29.7.0(@types/node@22.15.17): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.3) + create-jest: 29.7.0(@types/node@22.15.17) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.15.3) + jest-config: 29.7.0(@types/node@22.15.17) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.5.1 @@ -6190,7 +6190,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.15.3): + jest-config@29.7.0(@types/node@22.15.17): dependencies: '@babel/core': 7.18.2 '@jest/test-sequencer': 29.7.0 @@ -6215,7 +6215,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6245,7 +6245,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.0 - '@types/node': 22.15.3 + '@types/node': 22.15.17 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -6259,7 +6259,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6269,7 +6269,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.5 - '@types/node': 22.15.3 + '@types/node': 22.15.17 anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -6308,7 +6308,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 jest-util: 29.7.0 jest-pnp-resolver@1.2.2(jest-resolve@29.7.0): @@ -6343,7 +6343,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -6371,7 +6371,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -6417,7 +6417,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6436,7 +6436,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 22.15.17 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -6445,23 +6445,23 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.15.3 + '@types/node': 22.15.17 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.15.3): + jest@29.7.0(@types/node@22.15.17): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.15.3) + jest-cli: 29.7.0(@types/node@22.15.17) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6662,11 +6662,11 @@ snapshots: mimic-fn@2.1.0: {} - mini-css-extract-plugin@2.9.2(webpack@5.99.7): + mini-css-extract-plugin@2.9.2(webpack@5.99.8): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -7056,9 +7056,9 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.0 - rollup-plugin-ts@3.4.5(@babel/core@7.18.2)(rollup@4.40.1)(typescript@5.8.3): + rollup-plugin-ts@3.4.5(@babel/core@7.18.2)(rollup@4.40.2)(typescript@5.8.3): dependencies: - '@rollup/pluginutils': 5.0.2(rollup@4.40.1) + '@rollup/pluginutils': 5.0.2(rollup@4.40.2) '@wessberg/stringutil': 1.0.19 ansi-colors: 4.1.3 browserslist: 4.21.10 @@ -7066,37 +7066,37 @@ snapshots: compatfactory: 3.0.0(typescript@5.8.3) crosspath: 2.0.0 magic-string: 0.30.2 - rollup: 4.40.1 + rollup: 4.40.2 ts-clone-node: 3.0.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 optionalDependencies: '@babel/core': 7.18.2 - rollup@4.40.1: + rollup@4.40.2: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.1 - '@rollup/rollup-android-arm64': 4.40.1 - '@rollup/rollup-darwin-arm64': 4.40.1 - '@rollup/rollup-darwin-x64': 4.40.1 - '@rollup/rollup-freebsd-arm64': 4.40.1 - '@rollup/rollup-freebsd-x64': 4.40.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 - '@rollup/rollup-linux-arm-musleabihf': 4.40.1 - '@rollup/rollup-linux-arm64-gnu': 4.40.1 - '@rollup/rollup-linux-arm64-musl': 4.40.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 - '@rollup/rollup-linux-riscv64-gnu': 4.40.1 - '@rollup/rollup-linux-riscv64-musl': 4.40.1 - '@rollup/rollup-linux-s390x-gnu': 4.40.1 - '@rollup/rollup-linux-x64-gnu': 4.40.1 - '@rollup/rollup-linux-x64-musl': 4.40.1 - '@rollup/rollup-win32-arm64-msvc': 4.40.1 - '@rollup/rollup-win32-ia32-msvc': 4.40.1 - '@rollup/rollup-win32-x64-msvc': 4.40.1 + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 fsevents: 2.3.3 router@2.2.0: @@ -7123,17 +7123,17 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.5(sass@1.87.0)(webpack@5.99.7): + sass-loader@16.0.5(sass@1.88.0)(webpack@5.99.8): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.87.0 - webpack: 5.99.7(webpack-cli@6.0.1) + sass: 1.88.0 + webpack: 5.99.8(webpack-cli@6.0.1) - sass@1.87.0: + sass@1.88.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.1 + immutable: 5.1.2 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 @@ -7392,9 +7392,9 @@ snapshots: strip-json-comments@3.1.1: {} - style-loader@4.0.0(webpack@5.99.7): + style-loader@4.0.0(webpack@5.99.8): dependencies: - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) supports-color@7.2.0: dependencies: @@ -7410,14 +7410,14 @@ snapshots: tapable@2.2.1: {} - terser-webpack-plugin@5.3.14(webpack@5.99.7): + terser-webpack-plugin@5.3.14(webpack@5.99.8): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) terser@5.27.0: dependencies: @@ -7505,12 +7505,12 @@ snapshots: compatfactory: 3.0.0(typescript@5.8.3) typescript: 5.8.3 - ts-jest@29.3.2(@babel/core@7.18.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.18.2))(jest@29.7.0(@types/node@22.15.3))(typescript@5.8.3): + ts-jest@29.3.2(@babel/core@7.18.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.18.2))(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.3) + jest: 29.7.0(@types/node@22.15.17) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -7525,7 +7525,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.18.2) - ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.7): + ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.8): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.0 @@ -7533,7 +7533,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) tslib@2.8.1: {} @@ -7562,11 +7562,11 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.1 - typescript-eslint@8.31.1(eslint@9.26.0)(typescript@5.8.3): + typescript-eslint@8.32.0(eslint@9.26.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.31.1(eslint@9.26.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.1(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.0(eslint@9.26.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.0(eslint@9.26.0)(typescript@5.8.3) eslint: 9.26.0 typescript: 5.8.3 transitivePeerDependencies: @@ -7588,9 +7588,9 @@ snapshots: escalade: 3.1.2 picocolors: 1.1.1 - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.24.5): dependencies: - browserslist: 4.24.4 + browserslist: 4.24.5 escalade: 3.2.0 picocolors: 1.1.1 @@ -7642,12 +7642,12 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7): + webpack-cli@6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.7) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.7) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack@5.99.7) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.8) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.8) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack@5.99.8) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -7656,12 +7656,12 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.99.7) + webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.99.8) - webpack-dev-middleware@7.4.2(webpack@5.99.7): + webpack-dev-middleware@7.4.2(webpack@5.99.8): dependencies: colorette: 2.0.20 memfs: 4.17.0 @@ -7670,9 +7670,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.0 optionalDependencies: - webpack: 5.99.7(webpack-cli@6.0.1) + webpack: 5.99.8(webpack-cli@6.0.1) - webpack-dev-server@5.2.1(webpack-cli@6.0.1)(webpack@5.99.7): + webpack-dev-server@5.2.1(webpack-cli@6.0.1)(webpack@5.99.8): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -7700,11 +7700,11 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.7) + webpack-dev-middleware: 7.4.2(webpack@5.99.8) ws: 8.18.1 optionalDependencies: - webpack: 5.99.7(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7) + webpack: 5.99.8(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8) transitivePeerDependencies: - bufferutil - debug @@ -7719,7 +7719,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.99.7(webpack-cli@6.0.1): + webpack@5.99.8(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.7 @@ -7728,7 +7728,7 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.1 - browserslist: 4.24.4 + browserslist: 4.24.5 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 es-module-lexer: 1.7.0 @@ -7742,11 +7742,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.7) + terser-webpack-plugin: 5.3.14(webpack@5.99.8) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.7) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.99.8) transitivePeerDependencies: - '@swc/core' - esbuild